diff --git a/api/generados/[id].js b/api/generados/[id].js index 39a781c..aef2828 100644 --- a/api/generados/[id].js +++ b/api/generados/[id].js @@ -1,16 +1,28 @@ import { supabase } from '../../backend/lib/supabase.js' export default async function handler(req, res) { - if (req.method !== 'GET') return res.status(405).json({ error: 'Método no permitido' }) - const { id } = req.query - const { data, error } = await supabase - .from('guiones_generados') - .select('*') - .eq('id', id) - .single() + if (req.method === 'GET') { + const { data, error } = await supabase + .from('guiones_generados') + .select('*') + .eq('id', id) + .single() - if (error) return res.status(404).json({ error: 'Guion no encontrado' }) - res.json({ generado: data }) + if (error) return res.status(404).json({ error: 'Guion no encontrado' }) + return res.json({ generado: data }) + } + + if (req.method === 'DELETE') { + const { error } = await supabase + .from('guiones_generados') + .delete() + .eq('id', id) + + if (error) return res.status(500).json({ error: error.message }) + return res.json({ ok: true }) + } + + res.status(405).json({ error: 'Método no permitido' }) } diff --git a/api/guiones/[id].js b/api/guiones/[id].js index 74f1da3..9bae8d8 100644 --- a/api/guiones/[id].js +++ b/api/guiones/[id].js @@ -1,16 +1,28 @@ import { supabase } from '../../backend/lib/supabase.js' export default async function handler(req, res) { - if (req.method !== 'GET') return res.status(405).json({ error: 'Método no permitido' }) - const { id } = req.query - const { data, error } = await supabase - .from('guiones') - .select('*') - .eq('id', id) - .single() + if (req.method === 'GET') { + const { data, error } = await supabase + .from('guiones') + .select('*') + .eq('id', id) + .single() - if (error) return res.status(404).json({ error: 'Guion no encontrado' }) - res.json(data) + if (error) return res.status(404).json({ error: 'Guion no encontrado' }) + return res.json(data) + } + + if (req.method === 'DELETE') { + const { error } = await supabase + .from('guiones') + .delete() + .eq('id', id) + + if (error) return res.status(500).json({ error: error.message }) + return res.json({ ok: true }) + } + + res.status(405).json({ error: 'Método no permitido' }) } diff --git a/backend/server.js b/backend/server.js index 75732d7..a2f4f18 100644 --- a/backend/server.js +++ b/backend/server.js @@ -65,6 +65,17 @@ app.get('/api/guiones/:id', async (req, res) => { res.json(data) }) +// ── DELETE /api/guiones/:id ───────────────────────────────── +app.delete('/api/guiones/:id', async (req, res) => { + const { error } = await supabase + .from('guiones') + .delete() + .eq('id', req.params.id) + + if (error) return res.status(500).json({ error: error.message }) + res.json({ ok: true }) +}) + // ── GET /api/nichos ───────────────────────────────────────── // Lista de nichos distintos para el selector del formulario app.get('/api/nichos', async (req, res) => { @@ -348,6 +359,17 @@ app.get('/api/generados/:id', async (req, res) => { res.json(data) }) +// ── DELETE /api/generados/:id ─────────────────────────────── +app.delete('/api/generados/:id', async (req, res) => { + const { error } = await supabase + .from('guiones_generados') + .delete() + .eq('id', req.params.id) + + if (error) return res.status(500).json({ error: error.message }) + res.json({ ok: true }) +}) + app.listen(PORT, () => console.log(`Backend local corriendo en http://localhost:${PORT}`)) // ── Middleware global de manejo de errores ─────────────────── diff --git a/frontend/src/lib/api.js b/frontend/src/lib/api.js index 7fe7b0c..74e133e 100644 --- a/frontend/src/lib/api.js +++ b/frontend/src/lib/api.js @@ -28,10 +28,12 @@ export const api = { listar: (params = {}) => request('/guiones?' + new URLSearchParams(params)), listarTodos: (params = {}) => request('/guiones?' + new URLSearchParams({ ...params, todos: '1' })), obtener: (id) => request(`/guiones/${id}`), + eliminar: (id) => request(`/guiones/${id}`, { method: 'DELETE' }), }, generados: { - listar: (params = {}) => request('/generados?' + new URLSearchParams(params)), - obtener: (id) => request(`/generados/${id}`), + listar: (params = {}) => request('/generados?' + new URLSearchParams(params)), + obtener: (id) => request(`/generados/${id}`), + eliminar: (id) => request(`/generados/${id}`, { method: 'DELETE' }), }, analizar: (body) => request('/analizar', { method: 'POST', body: JSON.stringify(body) }), generar: (body) => request('/generar', { method: 'POST', body: JSON.stringify(body) }), diff --git a/frontend/src/views/ScriptsView.vue b/frontend/src/views/ScriptsView.vue index c3894e8..7136acc 100644 --- a/frontend/src/views/ScriptsView.vue +++ b/frontend/src/views/ScriptsView.vue @@ -178,9 +178,19 @@ - +
+ + +
@@ -301,6 +311,7 @@ const totalGuiones = ref(0) const modalGenerado = ref(null) const cargandoModal = ref(false) const copiadoModal = ref(false) +const eliminandoId = ref(null) const filtros = ref({ tipo: 'analizados', @@ -410,6 +421,30 @@ async function copiarGuionModal() { setTimeout(() => { copiadoModal.value = false }, 2000) } +async function confirmarEliminar(g) { + const titulo = filtros.value.tipo === 'analizados' + ? (g.tema_principal || 'este guion') + : (g.titulo_sugerido || 'este guion') + + if (!confirm(`¿Eliminar "${titulo}"? Esta acción no se puede deshacer.`)) return + + eliminandoId.value = g.id + try { + if (filtros.value.tipo === 'analizados') { + await api.guiones.eliminar(g.id) + } else { + await api.generados.eliminar(g.id) + } + guiones.value = guiones.value.filter(x => x.id !== g.id) + totalGuiones.value = Math.max(0, totalGuiones.value - 1) + } catch (e) { + console.error(e) + alert('No se pudo eliminar: ' + e.message) + } finally { + eliminandoId.value = null + } +} + function plataformaBadge(p) { const map = { tiktok: 'bg-red-950 text-red-400 border border-red-800',