Skip to content

feat: centralize student submissions - #38

Merged
eeminionn merged 1 commit into
mainfrom
agent/centralize-submissions
Jul 30, 2026
Merged

feat: centralize student submissions#38
eeminionn merged 1 commit into
mainfrom
agent/centralize-submissions

Conversation

@eeminionn

@eeminionn eeminionn commented Jul 30, 2026

Copy link
Copy Markdown
Owner

Issue relacionado

Closes #36

Qué cambia

  • Sustituye el repositorio por estudiante por un único repositorio privado central.
  • Guarda cada respuesta en resoluciones/<usuario>-<id>/misiones/<slug>/solucion.<ext>.
  • Conserva una fila RLS por estudiante, aunque todas apunten al mismo repositorio físico.
  • Elimina nuevas invitaciones de colaboración y oculta links inaccesibles en la vista estudiante.
  • Permite al mentor abrir directamente la carpeta exacta desde el detalle del estudiante.
  • Reintenta conflictos de escritura concurrente contra el último estado de la rama.
  • Verifica en el workflow que el token puede escribir en un repositorio realmente privado.

Por qué

Crear un repositorio por inscripción no escala. Guardar respuestas en el repositorio público de la aplicación filtraría soluciones, y compartir un repositorio privado con los estudiantes tampoco sirve porque GitHub no ofrece permisos por carpeta. El repositorio central queda accesible solo para el backend y el mentor; Supabase sigue aislando la experiencia de cada estudiante.

Implementación

La migración añade storage_mode y student_path, conserva los registros anteriores como legacy_per_student y permite que varias filas apunten al mismo repositorio. En el próximo login o entrega, el backend cambia la fila del estudiante a central sin borrar el repositorio anterior.

Las rutas se derivan en servidor a partir del login verificado, UUID, misión obtenida de la base y lenguaje tipado. El cliente no puede enviar una ruta. Los commits usan el nombre y correo noreply del estudiante como autor; el token del backend conserva la escritura. Tres reintentos acotados resuelven conflictos 409 por entregas simultáneas.

El repositorio eeminionn/tomatin-code-lab-resoluciones ya fue creado como privado, documentado y configurado sin issues, projects, wiki ni discussions. La entrega existente de louu27 fue copiada a resoluciones/louu27-ff7b18ec/... conservando el mismo blob SHA 716eb61470d2857d086ae52fa9576dc31d6c4f44.

Evidencia visual

El dashboard estudiantil muestra una “Carpeta privada sincronizada” sin enlace a GitHub. El detalle del mentor enlaza a la carpeta exacta. No se modifica el workspace de la misión.

Validación

  • pnpm check — 16 pruebas heredadas, 26 de la beta, 60 variantes, tipos Edge y build.
  • pnpm test:e2e — 13/13 recorridos.
  • supabase test db — 39/39 pruebas pgTAP en CI.
  • Pruebas unitarias de rutas estables, extensiones y traversal.
  • Repositorio central privado y entrega anterior verificadas mediante GitHub API.
  • YAML de despliegue válido.

Privacidad, seguridad y accesibilidad

  • Las respuestas no se guardan en el repositorio público.
  • Los estudiantes no son colaboradores y no pueden leer carpetas ajenas en GitHub.
  • RLS mantiene visible para cada estudiante solo su propia fila de sincronización.
  • No se aceptan rutas, roles ni identidad desde el cliente.
  • El token y el contenido privado permanecen en Edge Functions.
  • Los textos nuevos caben y los enlaces largos del mentor usan truncado seguro.

Despliegue

  1. Aplicar la migración aditiva.
  2. Verificar acceso privado y permiso de escritura del token.
  3. Configurar GITHUB_REPOSITORY_NAME en Supabase.
  4. Desplegar Edge Functions y GitHub Pages.

La variable SUBMISSION_REPOSITORY_NAME ya está configurada en Actions. Reversión: revertir la Edge Function para volver al flujo anterior; la migración es compatible y no elimina repositorios ni entregas históricas.

Checklist de entrega

  • El PR tiene responsable, labels y milestone.
  • Actualicé pruebas y documentación.
  • No contiene cambios ajenos al issue.
  • CI está en verde.
  • Está listo para revisión.

@eeminionn eeminionn added this to the Tomatin Code Lab 3.1 milestone Jul 30, 2026
@eeminionn eeminionn added enhancement New feature or request area: submissions Student submission persistence and GitHub synchronization. privacy Changes that affect access control or private student data. labels Jul 30, 2026
@eeminionn eeminionn self-assigned this Jul 30, 2026
@eeminionn
eeminionn marked this pull request as ready for review July 30, 2026 20:53
@eeminionn
eeminionn merged commit 3fd7ac3 into main Jul 30, 2026
2 checks passed
@eeminionn
eeminionn deleted the agent/centralize-submissions branch July 30, 2026 20:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: submissions Student submission persistence and GitHub synchronization. enhancement New feature or request privacy Changes that affect access control or private student data.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Centralizar las entregas estudiantiles en un repositorio privado

1 participant