RF47: Usuario consulta cursos disponibles
Descripción
Como usuario autenticado, quiero ver el catálogo de cursos de educación financiera disponibles para elegir qué aprender.
El Courses Module lee los metadatos de los cursos desde Finnova DB; el contenido de video vive en el bucket privado de S3 (Courses Database) y solo se entrega vía URLs prefirmadas al reproducir (RF53).
| Campo | Valor |
|---|---|
| Módulo | Courses Module |
| Actor | Usuario autenticado |
| Endpoint | GET /courses |
| Precondiciones | Sesión activa |
| Prioridad | Media (MVP) |
| Etapa | MBI 1 |
| Requisitos relacionados | RF48, RF50, RF52 |
Reglas de negocio
- RN-47.1 — Se listan solo cursos publicados (no borradores).
- RN-47.2 — Cada curso muestra título, descripción corta, categoría, nivel, duración, miniatura y si requiere plan premium.
- RN-47.3 — La lista se pagina; se puede ordenar por popularidad/novedad.
- RN-47.4 — Las miniaturas se sirven por URL prefirmada o CDN; el contenido de video no se expone aquí.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
page/pageSize (query, opcional) | Enteros dentro de rango. | "Parámetros de paginación no válidos." (400) |
Authorization | Bearer válido. | "Sesión no válida." (401) |
Criterios de aceptación
Escenario 1: Consulta de catálogo exitosa
Dado que hay cursos publicados,
Cuando abro la sección de cursos,
Entonces el sistema lista los cursos publicados paginados,
Y responde 200 OK.
Escenario 2: Catálogo vacío
Dado que no hay cursos publicados, Cuando abro la sección, Entonces se muestra un estado vacío.
Escenario 3: Curso premium en el catálogo
Dado que hay cursos solo para premium y estoy en Free, Cuando veo el catálogo, Entonces esos cursos aparecen marcados como premium (acceso se valida en RF52).
Criterios no funcionales
- Respuesta < 1.5 s con paginación.
- El contenido de video no se expone en la consulta del catálogo.
- Comunicación TLS 1.2+.