Skip to content

Latest commit

 

History

History
149 lines (113 loc) · 4.51 KB

File metadata and controls

149 lines (113 loc) · 4.51 KB

Política de Eliminación en Cascada

Este documento describe cómo funciona la eliminación de datos en el sistema cuando un profesor elimina recursos.

Eliminación de Videos

Cuando un profesor elimina un video usando deleteVideo(), se eliminan automáticamente TODOS los datos relacionados:

1. Archivo Físico

  • 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

2. Registro de Video

  • 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)

3. Visualizaciones de Estudiantes (CASCADE)

  • 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

4. Eventos de Analytics (CASCADE)

  • 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

Configuración de CASCADE

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 CASCADE

Eliminación de Cuentas de Profesor

Cuando un profesor elimina su cuenta usando deleteTeacherAccount():

Verificaciones Previas

  • Bloqueado si tiene estudiantes activos
  • Debe eliminar o reasignar estudiantes primero

Datos Eliminados

  1. Grupos del profesor (teacher_groups)
  2. Videos y todo lo relacionado (ver sección anterior)
  3. Perfil de profesor (teachers)
  4. Cuenta de autenticación (auth.users)

Eliminación de Cuentas de Estudiante

Cuando un estudiante elimina su cuenta usando deleteStudentAccount():

Datos Eliminados

  1. Eventos de analytics (video_analytics_events)
  2. Vistas de videos (video_views)
  3. Perfil de estudiante (students)
  4. Cuenta de autenticación (auth.users)

Logs y Monitoreo

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.

Interfaz de Usuario

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

Notas Importantes

  1. Irreversible: Todas las eliminaciones son permanentes y no se pueden deshacer.

  2. Atomic: La eliminación de la base de datos es transaccional, si falla no se elimina nada.

  3. 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).

  4. Revalidación: Después de eliminar, se ejecuta revalidatePath() para actualizar la UI inmediatamente.

  5. Seguridad: Todas las operaciones verifican teacher_id = user.id para evitar eliminaciones no autorizadas.

Flujo de Eliminación

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

Mantenimiento

Si necesitas agregar nuevas tablas relacionadas con videos:

  1. Asegúrate de agregar ON DELETE CASCADE en la foreign key
  2. Actualiza este documento
  3. Actualiza el diálogo de confirmación en videos-list.tsx
  4. Actualiza los logs en deleteVideo()