# 馃攲 ESPECIFICACI脫N API REST - SERVIDOR DE CONTENIDO TES **Versi贸n:** 1.0.0 **Fecha:** 2025-01-06 **Base URL:** `https://servidor-tes.com/api` (ejemplo) --- ## 馃搵 脥NDICE 1. [API P煤blica (App PWA)](#api-p煤blica-app-pwa) 2. [API Admin (Panel Admin)](#api-admin-panel-admin) 3. [C贸digos de Estado](#c贸digos-de-estado) 4. [Formato de Respuestas](#formato-de-respuestas) 5. [Rate Limiting](#rate-limiting) --- # API P脷BLICA (APP PWA) ## Endpoints de Solo Lectura ### 1. Health Check ``` GET /api/health ``` **Descripci贸n:** Verifica estado del servidor y base de datos. **Autenticaci贸n:** No requerida **Respuesta 200:** ```json { "status": "ok", "timestamp": "2025-01-06T12:00:00Z", "database": "connected", "latest_pack_version": "1.0.0", "latest_pack_hash": "sha256:abc123...", "server_version": "1.0.0" } ``` **Respuesta 503 (si BD desconectada):** ```json { "status": "error", "timestamp": "2025-01-06T12:00:00Z", "database": "disconnected", "message": "Base de datos no disponible" } ``` --- ### 2. Content Pack Latest ``` GET /api/content/pack/latest ``` **Descripci贸n:** Obtiene el Content Pack m谩s reciente (solo contenido publicado). **Autenticaci贸n:** No requerida **Headers:** - `If-None-Match: ` - Si el hash coincide, retorna 304 Not Modified **Respuesta 200:** ```json { "metadata": { "version": "1.0.0", "generated_at": "2025-01-06T12:00:00Z", "hash": "sha256:abc123...", "total_items": 45, "total_resources": 120 }, "content": { ... }, "media": { ... }, "links": { ... } } ``` **Headers de Respuesta:** - `ETag: ` - Hash del pack - `Content-Type: application/json` - `Cache-Control: public, max-age=3600` - Cache 1 hora **Respuesta 304:** Not Modified (si `If-None-Match` coincide) **Respuesta 404:** No hay pack disponible --- ### 3. Content Pack por Versi贸n ``` GET /api/content/pack/:version ``` **Descripci贸n:** Obtiene un Content Pack espec铆fico por versi贸n. **Par谩metros:** - `version` (path) - Versi贸n sem谩ntica (ej: "1.0.0") **Ejemplo:** ``` GET /api/content/pack/1.0.0 ``` **Respuesta 200:** Igual que `/pack/latest` **Respuesta 404:** Versi贸n no encontrada --- ### 4. Protocolo Individual ``` GET /api/content/protocol/:slug ``` **Descripci贸n:** Obtiene un protocolo espec铆fico con sus recursos asociados. **Par谩metros:** - `slug` (path) - Slug del protocolo (ej: "rcp-adulto-svb") **Ejemplo:** ``` GET /api/content/protocol/rcp-adulto-svb ``` **Respuesta 200:** ```json { "id": "550e8400-e29b-41d4-a716-446655440000", "type": "protocol", "slug": "rcp-adulto-svb", "title": "RCP Adulto - Soporte Vital B谩sico", "short_title": "RCP Adulto SVB", "description": "Protocolo de reanimaci贸n cardiopulmonar b谩sica en adultos", "clinical_context": "RCP", "level": "operativo", "priority": "critica", "status": "published", "version": "1.0.0", "content": { "steps": [...], "checklist": {...}, "warnings": [...], "key_points": [...] }, "resources": { "images": [ { "id": "...", "title": "Posici贸n de Manos - RCP Adulto", "url": "https://servidor-tes.com/media/images/rcp/...", "alt_text": "...", "section": "pasos", "position": 7 } ], "videos": [ { "id": "...", "title": "RCP Adulto SVB - T茅cnica Completa", "url": "https://servidor-tes.com/media/videos/rcp/...", "duration_seconds": 45, "section": "pasos", "position": 0 } ] }, "related": { "guide_id": "550e8400-...", "guide_slug": "rcp-adulto-svb-formativo", "manual_ids": ["..."], "related_protocol_ids": ["..."] } } ``` **Respuesta 404:** Protocolo no encontrado o no publicado --- ### 5. Gu铆a Individual ``` GET /api/content/guide/:slug ``` **Descripci贸n:** Obtiene una gu铆a formativa completa con sus 8 secciones. **Par谩metros:** - `slug` (path) - Slug de la gu铆a (ej: "abcde-operativo") **Respuesta 200:** ```json { "id": "...", "type": "guide", "slug": "abcde-operativo", "title": "ABCDE Operativo", "level": "formativo", "content": { "sections": [ { "numero": 1, "titulo": "Introducci贸n y Contexto", "markdown": "# Introducci贸n...", "resources": { "images": [...], "videos": [...] } }, // ... 7 secciones m谩s ], "related_protocol_id": "...", "related_manual_ids": [...] }, "resources": { "images": [...], "videos": [...] } } ``` --- ### 6. Recurso Multimedia ``` GET /api/content/media/:id ``` **Descripci贸n:** Obtiene informaci贸n de un recurso multimedia o redirige al archivo. **Par谩metros:** - `id` (path) - UUID del recurso **Query Params:** - `download` (boolean) - Si true, fuerza descarga **Respuesta 200 (JSON si no download):** ```json { "id": "...", "type": "image", "title": "Posici贸n de Manos - RCP Adulto", "url": "https://servidor-tes.com/media/images/rcp/rcp_posicion_manos_adulto.png", "alt_text": "...", "width": 1200, "height": 800, "file_size": 245678 } ``` **Respuesta 302 (Redirect si download):** - Redirige a URL del archivo **Respuesta 404:** Recurso no encontrado --- # API ADMIN (PANEL ADMIN) ## Autenticaci贸n ### Login ``` POST /api/admin/auth/login ``` **Body:** ```json { "email": "admin@emerges-tes.local", "password": "Admin123!" } ``` **Respuesta 200:** ```json { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "user": { "id": "...", "email": "admin@emerges-tes.local", "username": "admin", "role": "super_admin" }, "expiresIn": 86400 } ``` **Respuesta 401:** Credenciales inv谩lidas --- ### Me (Usuario Actual) ``` GET /api/admin/auth/me ``` **Autenticaci贸n:** Requerida (Bearer Token) **Respuesta 200:** ```json { "user": { "id": "...", "email": "...", "username": "...", "role": "...", "is_active": true } } ``` --- ## Contenido ### Listar Contenido ``` GET /api/admin/content ``` **Query Params:** - `type` - Filtrar por tipo (protocol, guide, manual, drug, checklist) - `status` - Filtrar por estado (draft, in_review, approved, published) - `priority` - Filtrar por prioridad (critica, alta, media, baja) - `search` - B煤squeda de texto - `page` - N煤mero de p谩gina (default: 1) - `limit` - Items por p谩gina (default: 20) **Respuesta 200:** ```json { "items": [...], "total": 45, "page": 1, "limit": 20, "totalPages": 3 } ``` --- ### Obtener Contenido ``` GET /api/admin/content/:id ``` **Respuesta 200:** ContentItem completo --- ### Crear Contenido ``` POST /api/admin/content ``` **Body:** ```json { "type": "protocol", "slug": "rcp-adulto-svb", "title": "RCP Adulto - Soporte Vital B谩sico", "clinical_context": "RCP", "level": "operativo", "priority": "critica", "source_guideline": "ERC", "content": { "steps": [...], "checklist": {...} }, "tags": ["rcp", "svb", "adulto"] } ``` **Respuesta 201:** ```json { "id": "...", "message": "Contenido creado correctamente" } ``` --- ### Actualizar Contenido ``` PUT /api/admin/content/:id ``` **Body:** Mismo formato que crear **Respuesta 200:** ```json { "id": "...", "message": "Contenido actualizado correctamente", "version": "1.1.0" } ``` --- ### Publicar Contenido ``` POST /api/admin/content/:id/publish ``` **Descripci贸n:** Cambia status a 'published' y genera nueva versi贸n. **Respuesta 200:** ```json { "id": "...", "status": "published", "version": "1.0.0", "message": "Contenido publicado correctamente" } ``` --- ### Solicitar Validaci贸n ``` POST /api/admin/content/:id/validate ``` **Body:** ```json { "comments": "Revisado y aprobado", "validator_role": "tes" } ``` **Respuesta 200:** ```json { "id": "...", "status": "approved", "validated_by": "...", "validated_at": "2025-01-06T12:00:00Z" } ``` --- ## Recursos Multimedia ### Listar Recursos ``` GET /api/admin/media ``` **Query Params:** - `type` - image | video - `status` - draft | approved | published - `block` - Filtrar por bloque - `search` - B煤squeda --- ### Upload Recurso ``` POST /api/admin/media/upload ``` **Content-Type:** `multipart/form-data` **Body:** - `file` - Archivo (imagen o v铆deo) - `title` - T铆tulo - `alt_text` - Texto alternativo - `description` - Descripci贸n - `tags` - Tags (JSON array) - `block` - Bloque tem谩tico - `priority` - critica | alta | media | baja - `usage_type` - operativo | formativo | referencia (puede ser array) **Respuesta 201:** ```json { "id": "...", "filename": "rcp_posicion_manos_adulto.png", "path": "/media/images/rcp/rcp_posicion_manos_adulto.png", "url": "https://servidor-tes.com/media/images/rcp/...", "file_size": 245678, "message": "Recurso subido correctamente" } ``` --- ### Asociar Recurso a Contenido ``` POST /api/admin/media/:id/associate ``` **Body:** ```json { "content_item_id": "...", "section": "pasos", "position": 7, "placement": "inline", "caption": "Posici贸n correcta de manos", "is_critical": true, "priority": "critica" } ``` --- ## Content Pack ### Generar Pack ``` POST /api/admin/pack/generate ``` **Body:** ```json { "version": "1.0.0", "include_draft": false, "notes": "Primera versi贸n del pack" } ``` **Respuesta 200:** ```json { "version": "1.0.0", "file_path": "/storage/packs/pack-v1.0.0.json", "file_url": "https://servidor-tes.com/api/content/pack/1.0.0", "hash": "sha256:abc123...", "size_bytes": 5242880, "total_items": 45, "total_resources": 120, "generated_at": "2025-01-06T12:00:00Z" } ``` --- ### Listar Versiones ``` GET /api/admin/pack/versions ``` **Respuesta 200:** ```json { "versions": [ { "version": "1.0.0", "generated_at": "2025-01-06T12:00:00Z", "size_bytes": 5242880, "total_items": 45, "is_latest": true }, { "version": "0.9.0", "generated_at": "2025-01-05T10:00:00Z", "size_bytes": 4890123, "total_items": 42, "is_latest": false } ] } ``` --- # C脫DIGOS DE ESTADO | C贸digo | Significado | Uso | |--------|-------------|-----| | 200 | OK | Operaci贸n exitosa | | 201 | Created | Recurso creado | | 304 | Not Modified | Pack sin cambios (If-None-Match) | | 400 | Bad Request | Datos inv谩lidos | | 401 | Unauthorized | No autenticado o token inv谩lido | | 403 | Forbidden | Sin permisos | | 404 | Not Found | Recurso no encontrado | | 409 | Conflict | Conflicto (ej: slug duplicado) | | 422 | Unprocessable Entity | Validaci贸n fallida | | 429 | Too Many Requests | Rate limit excedido | | 500 | Internal Server Error | Error del servidor | | 503 | Service Unavailable | Servicio no disponible (BD desconectada) | --- # FORMATO DE RESPUESTAS ## Respuesta Exitosa ```json { "data": { ... }, "meta": { "timestamp": "2025-01-06T12:00:00Z" } } ``` ## Respuesta de Error ```json { "error": { "code": "CONTENT_NOT_FOUND", "message": "Contenido no encontrado", "details": { "id": "...", "slug": "rcp-adulto-svb" } }, "meta": { "timestamp": "2025-01-06T12:00:00Z" } } ``` --- # RATE LIMITING ## API P煤blica (App) - **L铆mite:** 100 requests/minuto por IP - **Headers:** - `X-RateLimit-Limit: 100` - `X-RateLimit-Remaining: 95` - `X-RateLimit-Reset: 1641475200` ## API Admin - **L铆mite:** 50 requests/minuto por usuario - **Headers:** Mismo formato **Respuesta 429:** ```json { "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "Demasiadas solicitudes. Intenta de nuevo en 60 segundos." }, "retryAfter": 60 } ``` --- **Fin de la Especificaci贸n**