From 9510e9a1a17281a9e4a5f6abca68c137cd04fca1 Mon Sep 17 00:00:00 2001 From: BenitoBB Date: Sun, 18 May 2025 14:56:38 -0600 Subject: [PATCH] feat: enhance curso management by adding competency insertion and validation, update cursosArchivo and cursosVista for better handling of course data --- diplomas/src/pages/api/curso.js | 43 ++++++++++++++++++++++------ diplomas/src/pages/cursosArchivo.jsx | 4 +-- diplomas/src/pages/cursosVista.jsx | 28 ++++++++++++++++++ 3 files changed, 65 insertions(+), 10 deletions(-) diff --git a/diplomas/src/pages/api/curso.js b/diplomas/src/pages/api/curso.js index 81d3c00..9bbb7b2 100644 --- a/diplomas/src/pages/api/curso.js +++ b/diplomas/src/pages/api/curso.js @@ -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 }); } -} +} \ No newline at end of file diff --git a/diplomas/src/pages/cursosArchivo.jsx b/diplomas/src/pages/cursosArchivo.jsx index 49b6067..70fc244 100644 --- a/diplomas/src/pages/cursosArchivo.jsx +++ b/diplomas/src/pages/cursosArchivo.jsx @@ -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()) + : [], }), }); diff --git a/diplomas/src/pages/cursosVista.jsx b/diplomas/src/pages/cursosVista.jsx index 7025191..b57bbf0 100644 --- a/diplomas/src/pages/cursosVista.jsx +++ b/diplomas/src/pages/cursosVista.jsx @@ -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 {