Este documento describe cómo funciona la eliminación de datos en el sistema cuando un profesor elimina recursos.
Cuando un profesor elimina un video usando deleteVideo(), se eliminan automáticamente TODOS los datos relacionados:
- Ubicación: Cloudflare R2 Storage
- Proceso: Se elimina usando
deleteVideoFromR2(video_key) - Nota: Solo aplica para videos subidos (
video_type = 'upload'), no para videos de YouTube
- Tabla:
videos - Incluye:
- Información básica (título, descripción, URL)
- Transcripción automática (columna
transcript) - Estado de transcripción (
transcript_status) - Metadatos (duración, tamaño, mime_type)
- Tabla:
video_views - Eliminación: Automática vía
ON DELETE CASCADE - Incluye:
- Tiempo de visualización de cada estudiante
- Última posición vista
- Estado de completado
- Historial de vistas
- Tabla:
video_analytics_events - Eliminación: Automática vía
ON DELETE CASCADE - Incluye: Todos los eventos de interacción:
- Play/Pause
- Adelantar/Retroceder (seeks)
- Cambios de volumen y velocidad
- Eventos de pantalla completa
- Reinicios del video
- Finalizaciones
Las foreign keys están configuradas con ON DELETE CASCADE en las migraciones:
-- En video_views (009_create_videos_table.sql)
video_id UUID NOT NULL REFERENCES public.videos(id) ON DELETE CASCADE
-- En video_analytics_events (013_create_video_analytics_events.sql)
video_id UUID NOT NULL REFERENCES public.videos(id) ON DELETE CASCADECuando un profesor elimina su cuenta usando deleteTeacherAccount():
- ❌ Bloqueado si tiene estudiantes activos
- Debe eliminar o reasignar estudiantes primero
- Grupos del profesor (
teacher_groups) - Videos y todo lo relacionado (ver sección anterior)
- Perfil de profesor (
teachers) - Cuenta de autenticación (
auth.users)
Cuando un estudiante elimina su cuenta usando deleteStudentAccount():
- Eventos de analytics (
video_analytics_events) - Vistas de videos (
video_views) - Perfil de estudiante (
students) - Cuenta de autenticación (
auth.users)
La función deleteVideo() incluye logging detallado:
console.log(`Eliminando video ${videoId}:`, {
title: video.title,
type: video.video_type,
hasTranscript: !!video.transcript,
viewsCount: viewsCount || 0,
eventsCount: eventsCount || 0,
});Esto permite verificar en los logs de Cloudflare Pages que la eliminación se realizó correctamente.
El diálogo de confirmación informa explícitamente al usuario sobre TODO lo que se eliminará:
- ✅ Archivo de video del almacenamiento
- ✅ Transcripción automática (si existe)
- ✅ Todas las visualizaciones de los estudiantes
- ✅ Todas las métricas y eventos de análisis
- ✅ El progreso de los estudiantes en este video
-
Irreversible: Todas las eliminaciones son permanentes y no se pueden deshacer.
-
Atomic: La eliminación de la base de datos es transaccional, si falla no se elimina nada.
-
R2 Best Effort: Si falla la eliminación del archivo en R2, se continúa con la eliminación de la BD (se registra el error en logs).
-
Revalidación: Después de eliminar, se ejecuta
revalidatePath()para actualizar la UI inmediatamente. -
Seguridad: Todas las operaciones verifican
teacher_id = user.idpara evitar eliminaciones no autorizadas.
Usuario hace click en "Eliminar"
↓
Diálogo de confirmación detallado
↓
Usuario confirma
↓
Backend verifica permisos
↓
Cuenta registros relacionados (para logs)
↓
Elimina archivo de R2 (si aplica)
↓
Elimina registro de videos
↓
CASCADE automático elimina:
- video_views
- video_analytics_events
↓
Revalida caché de UI
↓
Retorna éxito
Si necesitas agregar nuevas tablas relacionadas con videos:
- Asegúrate de agregar
ON DELETE CASCADEen la foreign key - Actualiza este documento
- Actualiza el diálogo de confirmación en
videos-list.tsx - Actualiza los logs en
deleteVideo()