trading-platform/docs/02-definicion-modulos/OQI-002-education/implementacion/TRACEABILITY.yml

465 lines
15 KiB
YAML

# TRACEABILITY.yml - OQI-002 Módulo Educativo
# Mapeo de requerimientos a implementación
version: "1.0.0"
epic: OQI-002
name: "Módulo Educativo - Cursos de Trading"
updated: "2025-12-05"
status: pending
# Resumen de trazabilidad
summary:
total_requirements: 6
total_specs: 6
total_user_stories: 8
total_files_to_implement: 35
test_coverage: "TBD"
story_points: 45
# Mapeo de Requerimientos Funcionales
requirements:
RF-EDU-001:
name: "Catálogo de Cursos"
status: pending
specs:
- ET-EDU-001
- ET-EDU-002
- ET-EDU-003
user_stories:
- US-EDU-001
- US-EDU-002
implementation:
backend:
- path: apps/backend/src/modules/education/services/course.service.ts
description: "Servicio de gestión de cursos"
methods:
- getCourses
- getCourseBySlug
- getCourseById
- searchCourses
- getCoursesbyCategory
- path: apps/backend/src/modules/education/controllers/education.controller.ts
methods:
- listCourses
- getCourse
- path: apps/backend/src/modules/education/education.routes.ts
routes:
- "GET /education/courses"
- "GET /education/courses/:slug"
- "GET /education/categories"
frontend:
- path: apps/frontend/src/modules/education/pages/Courses.tsx
description: "Página de catálogo de cursos"
- path: apps/frontend/src/modules/education/pages/CourseDetail.tsx
description: "Página de detalle de curso"
- path: apps/frontend/src/modules/education/components/CourseCard.tsx
description: "Tarjeta de curso"
- path: apps/frontend/src/modules/education/components/CourseFilters.tsx
description: "Filtros de búsqueda"
database:
- path: apps/database/schemas/02_education_schema.sql
tables:
- courses
- course_categories
- course_tags
enums:
- course_level_enum
- course_status_enum
tests:
- path: apps/backend/tests/education/course.service.test.ts
status: pending
RF-EDU-002:
name: "Sistema de Lecciones"
status: pending
specs:
- ET-EDU-001
- ET-EDU-004
user_stories:
- US-EDU-003
- US-EDU-004
implementation:
backend:
- path: apps/backend/src/modules/education/services/lesson.service.ts
description: "Servicio de lecciones"
methods:
- getLessonsByCourse
- getLessonById
- getNextLesson
- getPreviousLesson
- path: apps/backend/src/modules/education/controllers/education.controller.ts
methods:
- getLessons
- getLesson
- path: apps/backend/src/modules/education/education.routes.ts
routes:
- "GET /education/courses/:id/lessons"
- "GET /education/lessons/:id"
frontend:
- path: apps/frontend/src/modules/education/pages/LessonViewer.tsx
description: "Visor de lecciones"
- path: apps/frontend/src/modules/education/components/LessonList.tsx
description: "Lista de lecciones del curso"
- path: apps/frontend/src/modules/education/components/LessonNavigation.tsx
description: "Navegación entre lecciones"
- path: apps/frontend/src/modules/education/components/VideoPlayer.tsx
description: "Reproductor de video"
database:
- path: apps/database/schemas/02_education_schema.sql
tables:
- lessons
- lesson_resources
enums:
- lesson_type_enum
- resource_type_enum
tests:
- path: apps/backend/tests/education/lesson.service.test.ts
status: pending
RF-EDU-003:
name: "Tracking de Progreso"
status: pending
specs:
- ET-EDU-001
- ET-EDU-003
user_stories:
- US-EDU-005
- US-EDU-007
implementation:
backend:
- path: apps/backend/src/modules/education/services/progress.service.ts
description: "Servicio de progreso"
methods:
- getProgress
- updateLessonProgress
- completeCourse
- getEnrolledCourses
- calculateCourseProgress
- path: apps/backend/src/modules/education/controllers/education.controller.ts
methods:
- getMyProgress
- markLessonComplete
- enrollInCourse
- path: apps/backend/src/modules/education/education.routes.ts
routes:
- "POST /education/courses/:id/enroll"
- "GET /education/my-courses"
- "POST /education/lessons/:id/progress"
- "GET /education/courses/:id/progress"
frontend:
- path: apps/frontend/src/modules/education/pages/MyLearning.tsx
description: "Página de mis cursos"
- path: apps/frontend/src/modules/education/components/ProgressBar.tsx
description: "Barra de progreso"
- path: apps/frontend/src/modules/education/components/ProgressSummary.tsx
description: "Resumen de progreso"
database:
- path: apps/database/schemas/02_education_schema.sql
tables:
- enrollments
- lesson_progress
tests:
- path: apps/backend/tests/education/progress.service.test.ts
status: pending
RF-EDU-004:
name: "Sistema de Quizzes"
status: pending
specs:
- ET-EDU-005
user_stories:
- US-EDU-006
implementation:
backend:
- path: apps/backend/src/modules/education/services/quiz.service.ts
description: "Servicio de quizzes"
methods:
- getQuiz
- submitQuiz
- getQuizResults
- calculateScore
- getQuizAttempts
- path: apps/backend/src/modules/education/controllers/education.controller.ts
methods:
- getQuiz
- submitQuizAnswers
- getQuizResults
- path: apps/backend/src/modules/education/education.routes.ts
routes:
- "GET /education/quizzes/:id"
- "POST /education/quizzes/:id/submit"
- "GET /education/quizzes/:id/results"
frontend:
- path: apps/frontend/src/modules/education/pages/QuizPage.tsx
description: "Página de quiz"
- path: apps/frontend/src/modules/education/components/QuizForm.tsx
description: "Formulario de quiz"
- path: apps/frontend/src/modules/education/components/QuizResults.tsx
description: "Resultados de quiz"
- path: apps/frontend/src/modules/education/components/QuizQuestion.tsx
description: "Componente de pregunta"
database:
- path: apps/database/schemas/02_education_schema.sql
tables:
- quizzes
- quiz_questions
- quiz_answers
- quiz_attempts
enums:
- question_type_enum
tests:
- path: apps/backend/tests/education/quiz.service.test.ts
status: pending
RF-EDU-005:
name: "Certificados"
status: pending
specs:
- ET-EDU-003
user_stories:
- US-EDU-008
implementation:
backend:
- path: apps/backend/src/modules/education/services/certificate.service.ts
description: "Servicio de certificados"
methods:
- generateCertificate
- getCertificates
- verifyCertificate
- downloadCertificate
- path: apps/backend/src/modules/education/controllers/education.controller.ts
methods:
- getMyCertificates
- downloadCertificate
- verifyCertificate
- path: apps/backend/src/modules/education/education.routes.ts
routes:
- "GET /education/certificates"
- "GET /education/certificates/:id/download"
- "GET /education/certificates/verify/:code"
frontend:
- path: apps/frontend/src/modules/education/pages/Certificates.tsx
description: "Página de certificados"
- path: apps/frontend/src/modules/education/components/CertificateCard.tsx
description: "Tarjeta de certificado"
- path: apps/frontend/src/modules/education/components/CertificateModal.tsx
description: "Modal de certificado"
database:
- path: apps/database/schemas/02_education_schema.sql
tables:
- certificates
tests:
- path: apps/backend/tests/education/certificate.service.test.ts
status: pending
RF-EDU-006:
name: "Gamificación"
status: pending
specs:
- ET-EDU-006
user_stories: []
implementation:
backend:
- path: apps/backend/src/modules/education/services/gamification.service.ts
description: "Servicio de gamificación"
methods:
- awardPoints
- getLeaderboard
- getBadges
- checkAchievements
- getStreak
- path: apps/backend/src/modules/education/controllers/education.controller.ts
methods:
- getLeaderboard
- getMyAchievements
- getMyBadges
- path: apps/backend/src/modules/education/education.routes.ts
routes:
- "GET /education/leaderboard"
- "GET /education/achievements"
- "GET /education/badges"
frontend:
- path: apps/frontend/src/modules/education/components/Leaderboard.tsx
description: "Tabla de clasificación"
- path: apps/frontend/src/modules/education/components/AchievementBadge.tsx
description: "Badge de logro"
- path: apps/frontend/src/modules/education/components/StreakCounter.tsx
description: "Contador de racha"
database:
- path: apps/database/schemas/02_education_schema.sql
tables:
- achievements
- user_achievements
- badges
- user_badges
- learning_streaks
tests:
- path: apps/backend/tests/education/gamification.service.test.ts
status: pending
# Mapeo de archivos de configuración
config_files:
backend:
- path: apps/backend/src/modules/education/education.module.ts
description: "Módulo de educación"
- path: apps/backend/src/modules/education/validators/education.validators.ts
description: "Validadores Zod"
- path: apps/backend/src/modules/education/types/education.types.ts
description: "Tipos TypeScript"
frontend:
- path: apps/frontend/src/modules/education/stores/education.store.ts
description: "Store de educación Zustand"
- path: apps/frontend/src/modules/education/hooks/useEducation.ts
description: "Hook principal de educación"
- path: apps/frontend/src/modules/education/services/education.api.ts
description: "Cliente API de educación"
# Dependencias externas
external_dependencies:
npm_backend:
- name: pdfkit
version: "^0.14.0"
usage: "Generación de certificados PDF"
- name: qrcode
version: "^1.5.3"
usage: "QR en certificados"
- name: sharp
version: "^0.33.0"
usage: "Procesamiento de imágenes"
npm_frontend:
- name: react-player
version: "^2.13.0"
usage: "Reproductor de video"
- name: "@tanstack/react-query"
version: "^5.0.0"
usage: "Data fetching"
services:
- name: Cloudflare Stream
purpose: "Video hosting y streaming"
alternative: "Vimeo OTT"
- name: AWS S3
purpose: "Almacenamiento de recursos"
# APIs de terceros
third_party_apis:
- name: Cloudflare Stream API
docs: https://developers.cloudflare.com/stream/
usage:
- Upload de videos
- Signed URLs
- Analytics de reproducciones
- name: AWS S3
docs: https://docs.aws.amazon.com/s3/
usage:
- Almacenamiento de recursos
- Certificados PDF
# Endpoints API
api_endpoints:
base_path: /api/v1/education
endpoints:
# Cursos
- method: GET
path: /courses
requirement: RF-EDU-001
auth: false
description: "Listar catálogo de cursos"
- method: GET
path: /courses/:slug
requirement: RF-EDU-001
auth: false
description: "Detalle de curso por slug"
- method: GET
path: /categories
requirement: RF-EDU-001
auth: false
description: "Listar categorías"
# Inscripción
- method: POST
path: /courses/:id/enroll
requirement: RF-EDU-003
auth: true
description: "Inscribirse a un curso"
- method: GET
path: /my-courses
requirement: RF-EDU-003
auth: true
description: "Mis cursos inscritos"
# Lecciones
- method: GET
path: /courses/:id/lessons
requirement: RF-EDU-002
auth: true
description: "Lecciones de un curso"
- method: GET
path: /lessons/:id
requirement: RF-EDU-002
auth: true
description: "Detalle de lección"
- method: POST
path: /lessons/:id/progress
requirement: RF-EDU-003
auth: true
description: "Actualizar progreso"
# Quizzes
- method: GET
path: /quizzes/:id
requirement: RF-EDU-004
auth: true
description: "Obtener quiz"
- method: POST
path: /quizzes/:id/submit
requirement: RF-EDU-004
auth: true
description: "Enviar respuestas"
- method: GET
path: /quizzes/:id/results
requirement: RF-EDU-004
auth: true
description: "Ver resultados"
# Certificados
- method: GET
path: /certificates
requirement: RF-EDU-005
auth: true
description: "Mis certificados"
- method: GET
path: /certificates/:id/download
requirement: RF-EDU-005
auth: true
description: "Descargar certificado"
- method: GET
path: /certificates/verify/:code
requirement: RF-EDU-005
auth: false
description: "Verificar certificado"
# Gamificación
- method: GET
path: /leaderboard
requirement: RF-EDU-006
auth: true
description: "Ver clasificación"
- method: GET
path: /achievements
requirement: RF-EDU-006
auth: true
description: "Mis logros"
# Dependencias de épicas
dependencies:
blocks: []
blocked_by:
- epic: OQI-001
reason: "Requiere autenticación de usuarios"
- epic: OQI-005
reason: "Compra de cursos requiere sistema de pagos"
type: partial
# Notas y decisiones
notes:
- "Videos almacenados en Cloudflare Stream con URLs firmadas"
- "Progreso guardado automáticamente cada 30 segundos"
- "Certificados con QR de verificación único"
- "Quizzes con intentos ilimitados pero score máximo registrado"
- "Sistema de puntos: 10 por lección, 50 por quiz aprobado, 100 por certificado"