trading-platform/docs/02-definicion-modulos/OQI-002-education
Adrian Flores Cortes cea9ae85f1 docs: Add 8 ET specifications from TASK-002 audit gaps
Complete remaining ET specs identified in INTEGRATION-PLAN:
- ET-EDU-007: Video Player Advanced (554 LOC component)
- ET-MT4-001: WebSocket Integration (BLOCKER - 0% implemented)
- ET-ML-009: Ensemble Signal (Multi-strategy aggregation)
- ET-TRD-009: Risk-Based Position Sizer (391 LOC component)
- ET-TRD-010: Drawing Tools Persistence (backend + store)
- ET-TRD-011: Market Bias Indicator (multi-timeframe analysis)
- ET-PFM-009: Custom Charts (SVG AllocationChart + Canvas PerformanceChart)
- ET-ML-008: ICT Analysis Card (expanded - 294 LOC component)

All specs include:
- Architecture diagrams
- Complete code examples
- API contracts
- Implementation guides
- Testing scenarios

Related: TASK-2026-01-25-002-FRONTEND-COMPREHENSIVE-AUDIT
Priority: P1-P3 (mixed)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 14:20:53 -06:00
..
especificaciones docs: Add 8 ET specifications from TASK-002 audit gaps 2026-01-25 14:20:53 -06:00
historias-usuario feat(ml): Complete FASE 11 - BTCUSD update and comprehensive documentation alignment 2026-01-07 09:31:29 -06:00
implementacion feat(ml): Complete FASE 11 - BTCUSD update and comprehensive documentation alignment 2026-01-07 09:31:29 -06:00
requerimientos feat(ml): Complete FASE 11 - BTCUSD update and comprehensive documentation alignment 2026-01-07 09:31:29 -06:00
_MAP.md feat(ml): Complete FASE 11 - BTCUSD update and comprehensive documentation alignment 2026-01-07 09:31:29 -06:00
README.md feat: Major platform documentation and architecture updates 2026-01-07 05:33:35 -06:00

id title type project version updated_date
README Modulo Educativo Documentation trading-platform 1.0.0 2026-01-04

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

@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

@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

@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

@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

{
  "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

// 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

// 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

Documentacion generada: 2025-12-05