Skip to content

Centralizar las entregas estudiantiles en un repositorio privado #36

Description

@eeminionn

Contexto

El flujo anterior creaba un repositorio privado por estudiante. Ese diseño preservaba la privacidad, pero no escalaba: cada inscripción agregaba otro repositorio a la cuenta de eeminionn.

GitHub autoriza por repositorio, no por carpeta. Por eso no es seguro guardar respuestas en el repositorio público tomatin-code-lab ni invitar a todos los estudiantes como colaboradores de un repositorio compartido: podrían leer soluciones ajenas.

Decisión técnica

Usar un único repositorio privado eeminionn/tomatin-code-lab-resoluciones, administrado por el backend. Cada entrega se guarda en una ruta estable:

resoluciones/<github-login>-<id-corto>/misiones/<slug>/solucion.<ext>

Los estudiantes no son colaboradores del repositorio central. La aplicación muestra únicamente el estado y la ruta de su propia sincronización. Los commits usan el nombre y correo noreply verificado del estudiante para conservar la atribución cuando GitHub puede asociarla.

Tareas

  • Añadir una migración compatible con los registros existentes para el modo de repositorio central.
  • Reemplazar el aprovisionamiento por estudiante por el aprovisionamiento idempotente de un único repositorio privado.
  • Sanitizar el nombre de carpeta y añadir un identificador estable para evitar colisiones.
  • Escribir y actualizar cada lenguaje dentro de la carpeta del estudiante y misión correspondiente.
  • Eliminar nuevas invitaciones de colaboración a estudiantes.
  • Actualizar el dashboard estudiantil y el detalle del mentor para reflejar el almacenamiento central.
  • Documentar la variable de configuración y el tratamiento de repositorios antiguos.
  • Añadir pruebas de contrato, RLS, concurrencia y regresión.

Criterios de aceptación

  • Una nueva inscripción no crea un repositorio GitHub adicional.
  • Dos estudiantes pueden sincronizar en carpetas distintas del mismo repositorio privado.
  • Un estudiante no puede leer entregas ajenas mediante la aplicación ni mediante GitHub.
  • El mentor puede abrir el repositorio y la ruta exacta de una entrega.
  • Reentregar una misión actualiza el mismo archivo en lugar de crear duplicados.
  • Los repositorios individuales existentes no se eliminan automáticamente.
  • CI, 13 pruebas E2E y 39 pruebas pgTAP están en verde.

Privacidad y seguridad

  • El repositorio central permanece privado y su permiso de escritura se comprueba durante el despliegue.
  • El token y las soluciones nunca llegan al bundle del navegador ni a logs.
  • No se aceptan nombres de carpeta ni rutas enviados por el cliente.
  • Los links directos al archivo se muestran solo al mentor.
  • Los conflictos 409 por entregas simultáneas se reintentan contra el último estado de la rama.

Migración

La entrega existente de louu27 fue copiada a resoluciones/louu27-ff7b18ec/... conservando el mismo blob SHA. El repositorio individual anterior no fue eliminado.

Resultado

Implementado y fusionado en #38. Supabase, GitHub Pages y CI de main finalizaron correctamente.

Metadata

Metadata

Assignees

Labels

area: submissionsStudent submission persistence and GitHub synchronization.enhancementNew feature or requestprivacyChanges that affect access control or private student data.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions