Some checks are pending
CI Pipeline / changes (push) Waiting to run
CI Pipeline / core (push) Blocked by required conditions
CI Pipeline / trading-backend (push) Blocked by required conditions
CI Pipeline / trading-data-service (push) Blocked by required conditions
CI Pipeline / trading-frontend (push) Blocked by required conditions
CI Pipeline / erp-core (push) Blocked by required conditions
CI Pipeline / erp-mecanicas (push) Blocked by required conditions
CI Pipeline / gamilit-backend (push) Blocked by required conditions
CI Pipeline / gamilit-frontend (push) Blocked by required conditions
Core: - Add catalog reference implementations (auth, payments, notifications, websocket, etc.) - New agent profiles: Database Auditor, Integration Validator, LLM Agent, Policy Auditor, Trading Strategist - Update SIMCO directives and add escalation/git guidelines - Add deployment inventory and audit execution reports Projects: - erp-suite: DevOps configs, Dockerfiles, shared libs, vertical enhancements - gamilit: Test structure, admin controllers, service refactoring, husky/commitlint - trading-platform: MT4 gateway, auth controllers, admin frontend, deployment scripts - platform_marketing_content: Full DevOps setup, tests, Docker configs - betting-analytics/inmobiliaria-analytics: Initial app structure 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
534 lines
15 KiB
Markdown
534 lines
15 KiB
Markdown
# API Documentation
|
|
|
|
## Base URL
|
|
|
|
**Production:** `http://74.208.126.102:3006/api`
|
|
**Development:** `http://localhost:3006/api`
|
|
|
|
## API Documentation (Swagger)
|
|
|
|
**Interactive Docs:** `http://74.208.126.102:3006/api/docs`
|
|
|
|
## Authentication
|
|
|
|
Todos los endpoints protegidos requieren un token JWT en el header:
|
|
|
|
```
|
|
Authorization: Bearer <jwt_token>
|
|
```
|
|
|
|
El token se obtiene al hacer login y tiene una duración de 24 horas.
|
|
|
|
## Core Endpoints
|
|
|
|
### Authentication (`/api/auth`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| POST | `/register` | Registrar nuevo usuario | No |
|
|
| POST | `/login` | Iniciar sesión | No |
|
|
| POST | `/logout` | Cerrar sesión | Yes |
|
|
| POST | `/refresh` | Refrescar token | Yes |
|
|
| GET | `/profile` | Obtener perfil del usuario | Yes |
|
|
| PUT | `/profile` | Actualizar perfil | Yes |
|
|
| POST | `/verify-email` | Verificar email | No |
|
|
| POST | `/forgot-password` | Solicitar reset de contraseña | No |
|
|
| POST | `/reset-password` | Resetear contraseña con token | No |
|
|
| PUT | `/password` | Cambiar contraseña | Yes |
|
|
| GET | `/sessions` | Listar sesiones activas | Yes |
|
|
| DELETE | `/sessions/:sessionId` | Cerrar sesión específica | Yes |
|
|
| DELETE | `/sessions` | Cerrar todas las sesiones | Yes |
|
|
|
|
#### Register User
|
|
|
|
```http
|
|
POST /api/auth/register
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"email": "student@example.com",
|
|
"password": "SecurePass123!",
|
|
"firstName": "Juan",
|
|
"lastName": "Pérez",
|
|
"role": "student"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"user": {
|
|
"id": "uuid",
|
|
"email": "student@example.com",
|
|
"firstName": "Juan",
|
|
"lastName": "Pérez",
|
|
"role": "student"
|
|
},
|
|
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
|
|
}
|
|
```
|
|
|
|
#### Login
|
|
|
|
```http
|
|
POST /api/auth/login
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"email": "student@example.com",
|
|
"password": "SecurePass123!"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"user": {
|
|
"id": "uuid",
|
|
"email": "student@example.com",
|
|
"firstName": "Juan",
|
|
"role": "student"
|
|
},
|
|
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
"expiresIn": "24h"
|
|
}
|
|
```
|
|
|
|
### Users (`/api/users`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/profile` | Obtener perfil actual | Yes |
|
|
| PUT | `/profile` | Actualizar perfil | Yes |
|
|
| GET | `/preferences` | Obtener preferencias | Yes |
|
|
| PUT | `/preferences` | Actualizar preferencias | Yes |
|
|
| POST | `/avatar` | Subir avatar | Yes |
|
|
| GET | `/statistics` | Estadísticas del usuario | Yes |
|
|
|
|
### Password Management (`/api/password`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| POST | `/reset-password/request` | Solicitar reset | No |
|
|
| POST | `/reset-password` | Resetear con token | No |
|
|
| PUT | `/change-password` | Cambiar contraseña | Yes |
|
|
| POST | `/verify-email` | Verificar email | No |
|
|
| POST | `/verify-email/resend` | Reenviar verificación | Yes |
|
|
| GET | `/verify-email/status` | Estado de verificación | Yes |
|
|
|
|
## Gamification Endpoints
|
|
|
|
### Ranks (`/api/gamification/ranks`)
|
|
|
|
Maya ranking system con 5 niveles.
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/` | Listar todos los rangos | Yes |
|
|
| GET | `/current` | Obtener rango actual del usuario | Yes |
|
|
| GET | `/:id` | Obtener detalles de un rango | Yes |
|
|
| GET | `/users/:userId/rank-progress` | Progreso hacia siguiente rango | Yes |
|
|
| GET | `/users/:userId/rank-history` | Historial de rangos | Yes |
|
|
| GET | `/check-promotion/:userId` | Verificar si califica para promoción | Yes |
|
|
| POST | `/promote/:userId` | Promover a siguiente rango | Yes (Admin) |
|
|
| POST | `/admin/ranks` | Crear nuevo rango | Yes (Admin) |
|
|
| PUT | `/admin/ranks/:id` | Actualizar rango | Yes (Admin) |
|
|
| DELETE | `/admin/ranks/:id` | Eliminar rango | Yes (Admin) |
|
|
|
|
**Maya Ranks:**
|
|
1. MERCENARIO (0-1000 pts)
|
|
2. GUERRERO (1000-2500 pts)
|
|
3. HOLCATTE (2500-5000 pts)
|
|
4. BATAB (5000-10000 pts)
|
|
5. NACOM (10000+ pts)
|
|
|
|
#### Get Current Rank
|
|
|
|
```http
|
|
GET /api/gamification/ranks/current
|
|
Authorization: Bearer <token>
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"rank": {
|
|
"id": "uuid",
|
|
"name": "GUERRERO",
|
|
"level": 2,
|
|
"minPoints": 1000,
|
|
"maxPoints": 2500,
|
|
"multiplier": 1.2,
|
|
"icon": "⚔️"
|
|
},
|
|
"currentPoints": 1500,
|
|
"progress": 0.2,
|
|
"nextRank": {
|
|
"name": "HOLCATTE",
|
|
"pointsNeeded": 1000
|
|
}
|
|
}
|
|
```
|
|
|
|
### Achievements (`/api/gamification/achievements`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/achievements` | Listar logros disponibles | Yes |
|
|
| GET | `/achievements/:id` | Detalles de un logro | Yes |
|
|
| GET | `/users/:userId/achievements` | Logros del usuario | Yes |
|
|
| POST | `/users/:userId/achievements/:achievementId` | Otorgar logro | Yes (System) |
|
|
| GET | `/users/:userId/achievements/summary` | Resumen de logros | Yes |
|
|
| POST | `/users/:userId/achievements/:achievementId/claim` | Reclamar recompensa | Yes |
|
|
| PATCH | `/achievements/:id` | Actualizar logro | Yes (Admin) |
|
|
|
|
### Leaderboard (`/api/gamification/leaderboard`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/leaderboard/global` | Leaderboard global | Yes |
|
|
| GET | `/leaderboard/schools/:schoolId` | Leaderboard por escuela | Yes |
|
|
| GET | `/leaderboard/classrooms/:classroomId` | Leaderboard por clase | Yes |
|
|
| GET | `/leaderboard/friends/:userId` | Leaderboard de amigos | Yes |
|
|
|
|
#### Get Global Leaderboard
|
|
|
|
```http
|
|
GET /api/gamification/leaderboard/global?limit=10&period=week
|
|
Authorization: Bearer <token>
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"leaderboard": [
|
|
{
|
|
"rank": 1,
|
|
"userId": "uuid",
|
|
"name": "Juan Pérez",
|
|
"points": 5000,
|
|
"rank": "HOLCATTE",
|
|
"avatar": "url"
|
|
},
|
|
...
|
|
],
|
|
"userPosition": {
|
|
"rank": 15,
|
|
"points": 2000
|
|
}
|
|
}
|
|
```
|
|
|
|
### Missions (`/api/gamification/missions`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/daily` | Misiones diarias | Yes |
|
|
| GET | `/weekly` | Misiones semanales | Yes |
|
|
| GET | `/special` | Misiones especiales | Yes |
|
|
| GET | `/stats/:userId` | Estadísticas de misiones | Yes |
|
|
| POST | `/:id/start` | Iniciar misión | Yes |
|
|
| PATCH | `/:id/progress` | Actualizar progreso | Yes |
|
|
| POST | `/:id/claim` | Reclamar recompensa | Yes |
|
|
|
|
### Shop (`/api/gamification/shop`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/categories` | Categorías de items | Yes |
|
|
| GET | `/items` | Listar items disponibles | Yes |
|
|
| GET | `/items/:id` | Detalles de un item | Yes |
|
|
| POST | `/purchase` | Comprar item | Yes |
|
|
| GET | `/purchases/:userId` | Historial de compras | Yes |
|
|
| GET | `/owned/:userId/:itemId` | Verificar si posee item | Yes |
|
|
|
|
### ML Coins (`/api/gamification/ml-coins`)
|
|
|
|
Moneda virtual del sistema.
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/users/:userId/ml-coins` | Balance de ML Coins | Yes |
|
|
| GET | `/users/:userId/ml-coins/transactions` | Historial de transacciones | Yes |
|
|
| POST | `/users/:userId/ml-coins/add` | Agregar ML Coins | Yes (System) |
|
|
| POST | `/users/:userId/ml-coins/spend` | Gastar ML Coins | Yes |
|
|
|
|
### User Stats (`/api/gamification/user-stats`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/users/:userId/stats` | Estadísticas completas | Yes |
|
|
| GET | `/users/:userId/summary` | Resumen de estadísticas | Yes |
|
|
| GET | `/users/:userId/rank` | Información de rango | Yes |
|
|
| PATCH | `/users/:userId/stats` | Actualizar estadísticas | Yes (System) |
|
|
|
|
## Educational Endpoints
|
|
|
|
### Content (`/api/content`)
|
|
|
|
Gestión de contenido educativo.
|
|
|
|
| Method | Endpoint | Description | Auth Required | Roles |
|
|
|--------|----------|-------------|---------------|-------|
|
|
| GET | `/subjects` | Listar materias | Yes | All |
|
|
| GET | `/subjects/:id` | Detalles de materia | Yes | All |
|
|
| GET | `/subjects/:id/modules` | Módulos de una materia | Yes | All |
|
|
| GET | `/modules/:id/lessons` | Lecciones de un módulo | Yes | All |
|
|
| GET | `/lessons/:id` | Detalles de una lección | Yes | All |
|
|
| POST | `/subjects` | Crear materia | Yes | Teacher, Admin |
|
|
| PUT | `/subjects/:id` | Actualizar materia | Yes | Teacher, Admin |
|
|
| DELETE | `/subjects/:id` | Eliminar materia | Yes | Admin |
|
|
|
|
### Assignments (`/api/assignments`)
|
|
|
|
Gestión de tareas y quizzes.
|
|
|
|
| Method | Endpoint | Description | Auth Required | Roles |
|
|
|--------|----------|-------------|---------------|-------|
|
|
| GET | `/` | Listar assignments | Yes | All |
|
|
| GET | `/:id` | Detalles de assignment | Yes | All |
|
|
| POST | `/` | Crear assignment | Yes | Teacher |
|
|
| PUT | `/:id` | Actualizar assignment | Yes | Teacher |
|
|
| DELETE | `/:id` | Eliminar assignment | Yes | Teacher |
|
|
| POST | `/:id/submit` | Enviar respuestas | Yes | Student |
|
|
| GET | `/:id/submissions` | Ver envíos | Yes | Teacher |
|
|
| POST | `/:id/grade` | Calificar envío | Yes | Teacher |
|
|
|
|
#### Submit Assignment
|
|
|
|
```http
|
|
POST /api/assignments/:id/submit
|
|
Authorization: Bearer <token>
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"answers": [
|
|
{
|
|
"questionId": "uuid",
|
|
"answer": "La respuesta correcta"
|
|
},
|
|
...
|
|
]
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"submission": {
|
|
"id": "uuid",
|
|
"score": 85,
|
|
"pointsAwarded": 850,
|
|
"feedback": "¡Buen trabajo!",
|
|
"correctAnswers": 17,
|
|
"totalQuestions": 20
|
|
},
|
|
"gamification": {
|
|
"pointsEarned": 850,
|
|
"rankMultiplier": 1.2,
|
|
"streakMultiplier": 1.1,
|
|
"currentRank": "GUERRERO",
|
|
"newAchievements": ["first_quiz_completed"]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Progress (`/api/progress`)
|
|
|
|
Tracking de progreso estudiantil.
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/users/:userId` | Progreso general del usuario | Yes |
|
|
| GET | `/users/:userId/subjects/:subjectId` | Progreso en una materia | Yes |
|
|
| GET | `/users/:userId/modules/:moduleId` | Progreso en un módulo | Yes |
|
|
| GET | `/analytics` | Analytics agregados | Yes (Teacher) |
|
|
|
|
## Admin Endpoints
|
|
|
|
### Admin Dashboard (`/api/admin/dashboard`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/stats` | Estadísticas generales | Yes (Admin) |
|
|
| GET | `/activity` | Actividad reciente | Yes (Admin) |
|
|
| GET | `/alerts` | Alertas del sistema | Yes (Admin) |
|
|
|
|
### Admin Users (`/api/admin/users`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/` | Listar usuarios | Yes (Admin) |
|
|
| GET | `/:id` | Detalles de usuario | Yes (Admin) |
|
|
| POST | `/` | Crear usuario | Yes (Admin) |
|
|
| PUT | `/:id` | Actualizar usuario | Yes (Admin) |
|
|
| DELETE | `/:id` | Eliminar usuario | Yes (Admin) |
|
|
| POST | `/:id/ban` | Banear usuario | Yes (Admin) |
|
|
| POST | `/:id/unban` | Desbanear usuario | Yes (Admin) |
|
|
|
|
### Admin Reports (`/api/admin/reports`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/usage` | Reporte de uso | Yes (Admin) |
|
|
| GET | `/performance` | Reporte de rendimiento | Yes (Admin) |
|
|
| GET | `/gamification` | Reporte de gamificación | Yes (Admin) |
|
|
| POST | `/export` | Exportar reportes | Yes (Admin) |
|
|
|
|
## Notifications
|
|
|
|
### Push Notifications (`/api/notifications`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/` | Listar notificaciones | Yes |
|
|
| GET | `/:id` | Detalles de notificación | Yes |
|
|
| PATCH | `/:id/read` | Marcar como leída | Yes |
|
|
| PATCH | `/mark-all-read` | Marcar todas como leídas | Yes |
|
|
| DELETE | `/:id` | Eliminar notificación | Yes |
|
|
| POST | `/subscribe` | Suscribirse a push | Yes |
|
|
| DELETE | `/unsubscribe` | Desuscribirse de push | Yes |
|
|
|
|
### WebSocket Events
|
|
|
|
**Connection:** `ws://74.208.126.102:3006`
|
|
|
|
**Events emitted by server:**
|
|
- `notification` - Nueva notificación
|
|
- `points_awarded` - Puntos otorgados
|
|
- `rank_upgraded` - Promoción de rango
|
|
- `achievement_unlocked` - Logro desbloqueado
|
|
- `assignment_graded` - Tarea calificada
|
|
- `new_message` - Nuevo mensaje
|
|
|
|
**Events to emit:**
|
|
- `join_room` - Unirse a sala
|
|
- `leave_room` - Salir de sala
|
|
- `typing` - Usuario escribiendo
|
|
|
|
## Health & Monitoring
|
|
|
|
### Health Check (`/api/health`)
|
|
|
|
| Method | Endpoint | Description | Auth Required |
|
|
|--------|----------|-------------|---------------|
|
|
| GET | `/` | Health check general | No |
|
|
| GET | `/db` | Database health | No |
|
|
| GET | `/redis` | Redis health | No |
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"status": "ok",
|
|
"timestamp": "2025-12-12T10:00:00Z",
|
|
"uptime": 3600,
|
|
"services": {
|
|
"database": "healthy",
|
|
"redis": "healthy"
|
|
}
|
|
}
|
|
```
|
|
|
|
## Error Responses
|
|
|
|
Todos los endpoints pueden retornar errores en el siguiente formato:
|
|
|
|
```json
|
|
{
|
|
"statusCode": 400,
|
|
"message": "Descripción del error",
|
|
"error": "Bad Request",
|
|
"timestamp": "2025-12-12T10:00:00Z",
|
|
"path": "/api/endpoint"
|
|
}
|
|
```
|
|
|
|
### Common Error Codes
|
|
|
|
| Code | Description |
|
|
|------|-------------|
|
|
| 400 | Bad Request - Datos inválidos |
|
|
| 401 | Unauthorized - Token inválido o expirado |
|
|
| 403 | Forbidden - Sin permisos |
|
|
| 404 | Not Found - Recurso no encontrado |
|
|
| 409 | Conflict - Conflicto (ej: email ya existe) |
|
|
| 422 | Unprocessable Entity - Validación fallida |
|
|
| 429 | Too Many Requests - Rate limit excedido |
|
|
| 500 | Internal Server Error - Error del servidor |
|
|
|
|
## Rate Limiting
|
|
|
|
- **General:** 100 requests por minuto por IP
|
|
- **Auth endpoints:** 5 requests por minuto
|
|
- **File uploads:** 10 requests por hora
|
|
|
|
## Pagination
|
|
|
|
Endpoints que retornan listas soportan paginación:
|
|
|
|
```http
|
|
GET /api/endpoint?page=1&limit=20&sortBy=createdAt&order=DESC
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [...],
|
|
"meta": {
|
|
"page": 1,
|
|
"limit": 20,
|
|
"total": 150,
|
|
"totalPages": 8,
|
|
"hasNext": true,
|
|
"hasPrevious": false
|
|
}
|
|
}
|
|
```
|
|
|
|
## Filtering & Search
|
|
|
|
Muchos endpoints soportan filtrado:
|
|
|
|
```http
|
|
GET /api/users?role=student&status=active&search=juan
|
|
```
|
|
|
|
## CORS
|
|
|
|
CORS está habilitado para los siguientes orígenes:
|
|
- `http://localhost:3005` (development)
|
|
- `http://74.208.126.102:3005` (production)
|
|
|
|
## API Versioning
|
|
|
|
Actualmente en versión 1. Las rutas futuras incluirán versionado:
|
|
- `/api/v1/endpoint` (futuro)
|
|
- `/api/endpoint` (actual, equivalente a v1)
|
|
|
|
## SDK Usage (Future)
|
|
|
|
```typescript
|
|
import { GamilitClient } from '@gamilit/sdk';
|
|
|
|
const client = new GamilitClient({
|
|
baseUrl: 'http://74.208.126.102:3006/api',
|
|
token: 'your-jwt-token'
|
|
});
|
|
|
|
// Login
|
|
await client.auth.login({ email, password });
|
|
|
|
// Get current rank
|
|
const rank = await client.gamification.getCurrentRank();
|
|
|
|
// Submit assignment
|
|
const result = await client.assignments.submit(assignmentId, answers);
|
|
```
|
|
|
|
## Additional Resources
|
|
|
|
- **Swagger UI:** http://74.208.126.102:3006/api/docs
|
|
- **Architecture:** [ARCHITECTURE.md](./ARCHITECTURE.md)
|
|
- **Deployment:** [DEPLOYMENT.md](./DEPLOYMENT.md)
|
|
- **Database Schema:** `/apps/database/ddl/`
|