RF60: Administrador agrega curso
Descripción
Como administrador, quiero crear un curso nuevo (metadatos + lecciones/videos) para ampliar el catálogo de educación financiera de Finnova.
Operación restringida por control de acceso por roles (RBAC): solo el rol admin puede ejecutarla (Compliance §5.1 — RBAC). Los metadatos se guardan en Finnova DB y los videos se suben al bucket privado de S3 (Courses Database, SSE-S3, sin acceso público — Cifrado §4.3).
| Campo | Valor |
|---|---|
| Módulo | Courses Module (administración) |
| Actor | Administrador (rol admin) |
| Endpoint | POST /admin/courses (+ carga de videos) |
| Precondiciones | Sesión activa con rol admin |
| Prioridad | Baja (post-MVP) |
| Etapa | MBI 1 |
| Requisitos relacionados | RF61, RF62, RF47 |
Reglas de negocio
- RN-60.1 — Solo el rol
admin(validado en el backend, no en el cliente) puede crear cursos. - RN-60.2 — Un curso se crea inicialmente como borrador (
draft); solo se publica cuando tiene los campos obligatorios y al menos una lección. - RN-60.3 — Los videos se suben a S3 privado; no se exponen públicamente (se sirven por URL prefirmada al reproducir, RF53).
- RN-60.4 — La creación se registra en el log de auditoría.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
title | Obligatorio. 3–120 caracteres. | "El título no es válido." |
description | Obligatorio. 10–2000 caracteres. | "La descripción no es válida." |
category | Obligatorio. Valor de catálogo. | "Selecciona una categoría válida." |
level | Obligatorio. Enum (basic, intermediate, advanced). | "Nivel no válido." |
videos | Formato permitido (MP4). Tamaño máx. por archivo definido. | "Sube un video válido dentro del tamaño permitido." |
| Rol | Debe ser admin. | "No tienes permisos para esta acción." (403) |
Entrada sanitizada y consultas parametrizadas; no se aceptan inyecciones SQL. Los archivos se validan por tipo MIME real y tamaño.
Criterios de aceptación
Escenario 1: Creación de curso exitosa
Dado que soy administrador y envío metadatos válidos,
Cuando creo el curso,
Entonces el sistema lo guarda como borrador,
Y sube los videos a S3 privado,
Y responde 201 Created,
Y registra el evento en auditoría.
Escenario 2: Campos obligatorios faltantes o inválidos
Dado que dejo campos obligatorios vacíos o con formato inválido,
Cuando intento crear,
Entonces el sistema responde 400 con el mensaje del campo afectado.
Escenario 3: Usuario sin rol admin (seguridad)
Dado que no tengo rol admin,
Cuando intento crear un curso,
Entonces el sistema responde 403 Forbidden,
Y registra el intento.
Escenario 4: Archivo de video inválido
Dado que subo un archivo no permitido o demasiado grande,
Cuando intento crear el curso,
Entonces el sistema responde 400 con "Sube un video válido dentro del tamaño permitido".
Criterios no funcionales
- RBAC validado en backend; auditoría obligatoria.
- Videos en S3 privado con SSE-S3; subida en segundo plano.
- Comunicación TLS 1.2+.