trading-platform/docs/02-definicion-modulos/OQI-002-education/README.md
Adrian Flores Cortes 8f0235c096 [TASK-2026-02-06-ANALISIS-INTEGRAL-DOCUMENTACION] docs: Complete 6-phase documentation analysis
- FASE-0: Diagnostic audit of 500+ files, 33 findings cataloged (7P0/8P1/12P2/6P3)
- FASE-1: Resolved 7 P0 critical conflicts (ports, paths, dedup OQI-010/ADR-002, orphan schemas)
- FASE-2: Resolved 8 P1 issues (traces, README/CLAUDE.md, DEPENDENCY-GRAPH v2.0, DDL drift, stack versions, DoR/DoD)
- FASE-3: Resolved 12 P2 issues (archived tasks indexed, RNFs created, OQI-010 US/RF/ET, AGENTS v2.0)
- FASE-4: Purged 3 obsolete docs to _archive/, fixed MODELO-NEGOCIO.md broken ref
- FASE-5: Cross-layer validation (DDL→OQI 66%, OQI→BE 72%, BE→FE 78%, Inventories 95%)
- FASE-6: INFORME-FINAL, SA-INDEX (18 subagents), METADATA COMPLETED

27/33 findings resolved (82%), 6 P3 deferred to backlog.
18 new files created, 40+ modified, 4 archived.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 10:57:03 -06:00

291 lines
6.8 KiB
Markdown

---
id: "README"
title: "Modulo Educativo"
type: "Documentation"
project: "trading-platform"
version: "1.0.0"
updated_date: "2026-02-06"
---
# OQI-002: Modulo Educativo
**Estado:** ✅ Implementado
**Fecha:** 2025-12-05
**Modulo:** `apps/backend/src/modules/courses`
---
## Descripcion
Sistema de cursos educativos con:
- Categorias de cursos
- Cursos con niveles de dificultad
- Modulos dentro de cada curso
- Lecciones con contenido multimedia
- Sistema de progreso del usuario
---
## Arquitectura
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Frontend │────▶│ NestJS API │────▶│ PostgreSQL │
│ /courses/* │ │ /courses/* │ │ education schema│
└─────────────────┘ └─────────────────┘ └─────────────────┘
```
---
## Endpoints
| Metodo | Ruta | Descripcion | Auth |
|--------|------|-------------|------|
| GET | `/courses` | Listar cursos (paginado) | - |
| GET | `/courses/:id` | Detalle de curso | - |
| POST | `/courses` | Crear curso | Admin |
| PATCH | `/courses/:id` | Actualizar curso | Admin |
| DELETE | `/courses/:id` | Eliminar curso | Admin |
| GET | `/courses/categories` | Listar categorias | - |
| POST | `/courses/categories` | Crear categoria | Admin |
---
## Entidades
### Category
```typescript
@Entity({ name: 'categories', schema: 'education' })
class Category {
id: string; // UUID
name: string; // "Trading Basico"
slug: string; // "trading-basico"
description?: string;
color?: string; // "#3B82F6"
iconName?: string; // "chart-line"
sortOrder: number; // Para ordenar
isActive: boolean;
createdAt: Date;
updatedAt: Date;
}
```
### Course
```typescript
@Entity({ name: 'courses', schema: 'education' })
class Course {
id: string;
categoryId: string;
title: string; // "Introduccion al Trading"
slug: string; // "introduccion-trading"
subtitle?: string;
description: string;
thumbnailUrl?: string;
level: DifficultyLevel; // beginner | intermediate | advanced | expert
status: PublishStatus; // draft | published | archived
price?: number; // null = gratis
discountPrice?: number;
isFree: boolean;
isFeatured: boolean;
durationMinutes?: number;
sortOrder: number;
publishedAt?: Date;
createdAt: Date;
updatedAt: Date;
}
```
### Module
```typescript
@Entity({ name: 'modules', schema: 'education' })
class Module {
id: string;
courseId: string;
title: string; // "Fundamentos del Mercado"
description?: string;
sortOrder: number;
isActive: boolean;
createdAt: Date;
updatedAt: Date;
}
```
### Lesson
```typescript
@Entity({ name: 'lessons', schema: 'education' })
class Lesson {
id: string;
moduleId: string;
title: string; // "Que es el Trading"
slug: string;
type: LessonType; // video | article | quiz | exercise
content?: string; // Contenido markdown/HTML
videoUrl?: string;
durationMinutes?: number;
sortOrder: number;
isFree: boolean; // Preview gratuito
isActive: boolean;
createdAt: Date;
updatedAt: Date;
}
```
---
## Niveles de Dificultad
| Nivel | Label ES | Color |
|-------|----------|-------|
| beginner | Principiante | Verde |
| intermediate | Intermedio | Azul |
| advanced | Avanzado | Naranja |
| expert | Experto | Rojo |
---
## Query Parameters
### GET /courses
| Param | Tipo | Descripcion |
|-------|------|-------------|
| page | number | Pagina (default: 1) |
| limit | number | Items por pagina (default: 10, max: 100) |
| categoryId | uuid | Filtrar por categoria |
| level | string | Filtrar por nivel |
| isFree | boolean | Solo cursos gratuitos |
| isFeatured | boolean | Solo destacados |
| status | string | Estado de publicacion |
| search | string | Buscar en titulo/descripcion |
| sortBy | string | Campo para ordenar |
| sortOrder | asc/desc | Direccion de orden |
---
## Respuesta Paginada
```json
{
"data": [
{
"id": "uuid",
"title": "Introduccion al Trading",
"level": "beginner",
"price": 29.99,
"isFree": false,
"thumbnailUrl": "https://...",
"durationMinutes": 180,
"category": {
"id": "uuid",
"name": "Trading Basico"
}
}
],
"meta": {
"page": 1,
"limit": 10,
"total": 45,
"totalPages": 5
}
}
```
---
## Flujo de Compra
```
1. Usuario ve catalogo de cursos
2. Selecciona curso de pago
3. Redirige a checkout (Stripe)
4. Pago exitoso -> webhook actualiza acceso
5. Usuario puede ver contenido completo
```
---
## Frontend
### Pagina de Cursos
```typescript
// apps/frontend/src/pages/Courses.tsx
function Courses() {
const [courses, setCourses] = useState<Course[]>([]);
const [categories, setCategories] = useState<Category[]>([]);
const [selectedCategory, setSelectedCategory] = useState('');
// Carga cursos con filtros
// Muestra grid de cards
// Paginacion
}
```
### Servicio
```typescript
// apps/frontend/src/services/courses.ts
export const coursesService = {
getCourses(params: CourseQueryParams): Promise<PaginatedResponse<Course>>,
getCourse(id: string): Promise<Course>,
getCategories(): Promise<Category[]>,
};
```
---
## Archivos
```
apps/backend/src/modules/courses/
├── dto/
│ ├── course.dto.ts
│ ├── module.dto.ts
│ └── lesson.dto.ts
├── entities/
│ ├── category.entity.ts
│ ├── course.entity.ts
│ ├── module.entity.ts
│ └── lesson.entity.ts
├── courses.controller.ts
├── courses.service.ts
└── courses.module.ts
apps/frontend/src/
├── pages/
│ └── Courses.tsx
└── services/
└── courses.ts
```
---
## Proximas Mejoras
- [ ] Progreso del usuario por leccion
- [ ] Sistema de quizzes
- [ ] Certificados de finalizacion
- [ ] Reviews y ratings
- [ ] Busqueda full-text
---
## Schemas DDL Asignados
Este modulo es owner del siguiente schema DDL:
| Schema | Tablas | Descripcion |
|--------|--------|-------------|
| **education** | 19 | courses, course_modules, lessons, quizzes, quiz_questions, quiz_answers, quiz_attempts, user_courses, user_progress, user_achievements, achievements, certificates, gamification_rewards, gamification_levels, gamification_challenges, gamification_user_challenges, learning_paths, learning_path_courses, user_streaks |
**Total tablas:** 19
**Nota DDL drift:** Documentacion previa listaba ~13 tablas. Las 6 tablas adicionales son: gamification_levels, gamification_challenges, gamification_user_challenges, learning_paths, learning_path_courses, user_streaks. Actualizado por TASK-2026-02-06 F2.6.
---
*Documentacion generada: 2025-12-05*