feat: enhance curso management by adding competency insertion and validation, update cursosArchivo and cursosVista for better handling of course data

This commit is contained in:
BenitoBB 2025-05-18 14:56:38 -06:00
parent 1ea33d7097
commit 9510e9a1a1
3 changed files with 65 additions and 10 deletions

View File

@ -1,4 +1,3 @@
// pages/api/curso.js
import { createClient } from "@/utils/supabase";
export default async function handler(req, res) {
@ -10,20 +9,48 @@ export default async function handler(req, res) {
const supabase = createClient({ req, res });
const { nombre, horas, descripcion, competencias } = req.body;
if (!nombre || !horas || !descripcion || !competencias) {
if (!nombre || !horas || !descripcion || !Array.isArray(competencias)) {
return res.status(400).json({ error: "Faltan datos del curso" });
}
const { data, error } = await supabase
// 1. Insertar el curso
const { data: cursoInsertado, error: errorCurso } = await supabase
.from("curso")
.insert([{ nombre, horas, descripcion, competencias }]);
.insert([{ nombre, horas, descripcion }])
.select("id")
.single();
if (error) {
return res.status(500).json({ error: "Error al insertar en Supabase", detalles: error.message });
if (errorCurso) {
return res.status(500).json({ error: "Error al insertar el curso", detalles: errorCurso.message });
}
return res.status(200).json({ mensaje: "Curso registrado", data });
const cursoId = cursoInsertado.id;
// 2. Insertar competencias y asociar en la tabla pivote
for (const descripcionComp of competencias) {
// Insertar competencia (sin validación, siempre se inserta)
const { data: competenciaInsertada, error: errorComp } = await supabase
.from("competencia")
.insert([{ descripcion: descripcionComp }])
.select("id")
.single();
if (errorComp) {
return res.status(500).json({ error: "Error al insertar competencia", detalles: errorComp.message });
}
// Insertar en la tabla pivote
const competenciaId = competenciaInsertada.id;
const { error: errorPivote } = await supabase
.from("curso_competencia")
.insert([{ curso_id: cursoId, competencia_id: competenciaId }]);
if (errorPivote) {
return res.status(500).json({ error: "Error al asociar competencia", detalles: errorPivote.message });
}
}
return res.status(200).json({ mensaje: "Curso registrado correctamente" });
} catch (err) {
return res.status(500).json({ error: "Error interno del servidor", detalles: err.message });
}
}
}

View File

@ -29,8 +29,8 @@ export default function cursosArchivo() {
horas: curso.horas,
descripcion: curso.descripcion,
competencias: curso.competencias
? curso.competencias.split(",").map(c => c.trim())
: [],
? curso.competencias.split(",").map(c => c.trim())
: [],
}),
});

View File

@ -143,10 +143,38 @@ export default function CursosVista() {
};
const eliminarCurso = async () => {
// 0. Verifica si hay alumnos inscritos a este curso
const { data: alumnosInscritos, error: errorAlumnos } = await supabaseClient
.from("alumno")
.select("id")
.eq("curso_id", cursoAEliminar);
if (errorAlumnos) {
setModalMensaje("Error al verificar alumnos inscritos.");
setConfirmarEliminar(false);
setMostrarModal(true);
return;
}
if (alumnosInscritos && alumnosInscritos.length > 0) {
setModalMensaje("No se puede eliminar el curso porque hay alumnos inscritos a este curso.");
setConfirmarEliminar(false);
setMostrarModal(true);
return;
}
// 1. Elimina relaciones en la tabla pivote
await supabaseClient
.from("curso_competencia")
.delete()
.eq("curso_id", cursoAEliminar);
// 2. Elimina el curso
const { error } = await supabaseClient
.from("curso")
.delete()
.eq("id", cursoAEliminar);
if (error) {
setModalMensaje("Error al eliminar el curso");
} else {