🏥 Clínica Vallecito API v1.0.0

Documentación interactiva de endpoints

13
Módulos
55
Endpoints
REST
Arquitectura
JSON
Formato
🔐 Autenticación/api/auth
POST
/api/auth/login
Iniciar sesión con email y contraseña
# Request POST /api/auth/login Content-Type: application/json { "email": "admin@clinicavallecito.com", "password": "123456" } # Response 200 { "exito": true, "mensaje": "Inicio de sesión exitoso", "datos": { "token": "eyJhbGciOiJIUzI1NiIs...", "usuario": { "idHash": "a1b2c3d4", "firstName": "Admin", "lastName": "Principal", "email": "admin@clinicavallecito.com", "role": { "id": 1, "name": "superadmin" } } } }
👤 Usuarios/api/usuarios
POST
/api/usuarios/admin
Crear el super administrador inicial del sistema
# Request POST /api/usuarios/admin Content-Type: application/json { "firstName": "Admin", "lastName": "Principal", "email": "admin@clinicavallecito.com", "password": "123456" } # Response 201 { "exito": true, "mensaje": "Super administrador creado", "datos": { "idHash": "a1b2c3d4", "firstName": "Admin", "lastName": "Principal", "email": "admin@clinicavallecito.com" } }
GET
/api/usuarios/perfil
Obtener el perfil del usuario autenticado (requiere token)
# Request GET /api/usuarios/perfil Authorization: Bearer eyJhbGciOi... # Response 200 { "exito": true, "mensaje": "Perfil obtenido", "datos": { "idHash": "a1b2c3d4", "firstName": "Admin", "lastName": "Principal", "email": "admin@clinicavallecito.com", "role": { "id": 1, "name": "superadmin" } } }
🛡️ Roles/api/roles
GET
/api/roles
Listar todos los roles del sistema
# Response 200 { "exito": true, "mensaje": "Roles obtenidos", "datos": [ { "idHash": "r1", "name": "superadmin", "description": "Acceso total", "accessLevel": 100 }, { "idHash": "r2", "name": "admin", "description": "Administrador", "accessLevel": 80 }, { "idHash": "r3", "name": "recepcionista", "description": "Recepción", "accessLevel": 30 } ] }
POST
/api/roles/init
Inicializar los roles por defecto del sistema
# Response 201 { "exito": true, "mensaje": "Roles inicializados correctamente" }
🏢 Departamentos/api/departamentos
GET
/api/departamentos
Listar todos los departamentos
# Response 200 { "exito": true, "mensaje": "Departamentos obtenidos", "datos": [ { "idHash": "dep1", "name": "Cardiología", "themeColor": "#e53e3e" }, { "idHash": "dep2", "name": "Traumatología", "themeColor": "#3182ce" } ] }
GET
/api/departamentos/:idHash
Obtener un departamento por su idHash
POST
/api/departamentos
Crear un nuevo departamento
# Request POST /api/departamentos Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "name": "Cardiología", "themeColor": "#e53e3e" } # Response 201 { "exito": true, "mensaje": "Departamento creado", "datos": { "idHash": "dep1", "name": "Cardiología", "themeColor": "#e53e3e" } }
PUT
/api/departamentos/:idHash
Actualizar un departamento existente
DELETE
/api/departamentos/:idHash
Eliminar un departamento (soft delete)
🩺 Servicios/api/servicios
GET
/api/servicios
Listar todos los servicios médicos
# Response 200 { "exito": true, "mensaje": "Servicios obtenidos", "datos": [ { "idHash": "srv1", "name": "Consulta Cardiológica", "description": "Evaluación completa del corazón", "imageUrl": "/uploads/servicios/srv1.webp", "iconUrl": "/uploads/servicios/srv1_icon.webp", "department": { "idHash": "dep1", "name": "Cardiología" } } ] }
GET
/api/servicios/:idHash
Obtener un servicio con galería de imágenes
POST
/api/servicios
Crear un servicio (multipart: image, icon)
# Request (multipart/form-data) POST /api/servicios Authorization: Bearer eyJhbGciOi... name = "Consulta Cardiológica" description = "Evaluación completa del corazón" departmentId = 1 image = [archivo.jpg] # Imagen principal icon = [icono.png] # Ícono del servicio
PUT
/api/servicios/:idHash
Actualizar un servicio (multipart: image, icon)
DELETE
/api/servicios/:idHash
Eliminar un servicio (soft delete)
🔗 Sub-Servicios/api/sub-servicios
GET
/api/sub-servicios
Listar todos los sub-servicios
# Response 200 { "exito": true, "mensaje": "Sub-servicios obtenidos", "datos": [ { "idHash": "ss1", "introduction": { "title": "Ecocardiograma", "description": "...", "video_url": "" }, "abstract": { "title": "Resumen", "description": "...", "image_url": "/uploads/..." }, "closing": [{ "title": "Beneficios", "description": "...", "image_url": "/uploads/..." }], "service": { "idHash": "srv1", "name": "Consulta Cardiológica" } } ] }
GET
/api/sub-servicios/:idHash
Obtener un sub-servicio por su idHash
POST
/api/sub-servicios
Crear sub-servicio (multipart: abstract_image, closing_image_0...N)
# Request (multipart/form-data con upload.any()) POST /api/sub-servicios Authorization: Bearer eyJhbGciOi... serviceId = 1 introduction = '{"title":"...","description":"...","video_url":""}' abstract = '{"title":"...","description":"..."}' closing = '[{"title":"...","description":"..."}]' abstract_image = [archivo.jpg] # Imagen del resumen closing_image_0 = [archivo.jpg] # Imagen del cierre[0]
PUT
/api/sub-servicios/:idHash
Actualizar sub-servicio (multipart: abstract_image, closing_image_N)
DELETE
/api/sub-servicios/:idHash
Eliminar un sub-servicio (soft delete)
👨‍⚕️ Doctores/api/doctores
GET
/api/doctores
Listar todos los doctores
# Response 200 { "exito": true, "mensaje": "Doctores obtenidos", "datos": [ { "idHash": "doc1", "firstName": "Juan", "lastName": "Pérez", "specialty": "Cardiología", "cmp": "012345", "rne": "067890", "photoUrl": "/uploads/doctores/doc1.webp" } ] }
GET
/api/doctores/:idHash
Obtener un doctor por su idHash
POST
/api/doctores
Registrar un doctor (multipart: image para foto)
# Request (multipart/form-data) POST /api/doctores Authorization: Bearer eyJhbGciOi... firstName = "Juan" lastName = "Pérez" specialty = "Cardiología" cmp = "012345" rne = "067890" image = [foto.jpg]
PUT
/api/doctores/:idHash
Actualizar datos de un doctor (multipart: image)
DELETE
/api/doctores/:idHash
Eliminar un doctor (soft delete)
⭐ Casos de Éxito/api/casos-exito
GET
/api/casos-exito
Listar todos los casos de éxito
# Response 200 { "exito": true, "mensaje": "Casos de éxito obtenidos", "datos": [ { "idHash": "ce1", "treatmentName": "Cirugía de válvula mitral", "description": "Paciente recuperado en 2 semanas", "beforeImageUrl": "/uploads/casos-exito/ce1_before.webp", "afterImageUrl": "/uploads/casos-exito/ce1_after.webp", "department": { "idHash": "dep1", "name": "Cardiología" } } ] }
GET
/api/casos-exito/:idHash
Obtener un caso de éxito por su idHash
POST
/api/casos-exito
Crear caso de éxito (multipart: beforeImage, afterImage)
# Request (multipart/form-data) POST /api/casos-exito Authorization: Bearer eyJhbGciOi... treatmentName = "Cirugía de válvula mitral" description = "Paciente recuperado en 2 semanas" departmentId = 1 beforeImage = [antes.jpg] afterImage = [despues.jpg]
PUT
/api/casos-exito/:idHash
Actualizar un caso de éxito (multipart: beforeImage, afterImage)
DELETE
/api/casos-exito/:idHash
Eliminar un caso de éxito (soft delete)
🏗️ Infraestructuras/api/infraestructuras
GET
/api/infraestructuras
Listar todas las infraestructuras de la clínica
# Response 200 { "exito": true, "mensaje": "Infraestructuras obtenidas", "datos": [ { "idHash": "inf1", "name": "Sala de Operaciones", "title": "Quirófano Principal", "subTitle": "Equipado con tecnología de última generación", "description": "...", "imageUrl": "/uploads/infraestructuras/inf1.webp", "department": { "idHash": "dep1", "name": "Cardiología" } } ] }
GET
/api/infraestructuras/:idHash
Obtener una infraestructura con galería de imágenes
POST
/api/infraestructuras
Crear infraestructura (multipart: image)
# Request (multipart/form-data) POST /api/infraestructuras Authorization: Bearer eyJhbGciOi... name = "Sala de Operaciones" title = "Quirófano Principal" subTitle = "Equipado con tecnología de última generación" description = "Sala de operaciones con equipos modernos" departmentId = 1 image = [foto.jpg]
PUT
/api/infraestructuras/:idHash
Actualizar una infraestructura (multipart: image)
DELETE
/api/infraestructuras/:idHash
Eliminar una infraestructura (soft delete)
🤝 Sponsors/api/sponsors
GET
/api/sponsors
Listar todos los sponsors/aliados
# Response 200 { "exito": true, "mensaje": "Sponsors obtenidos", "datos": [ { "idHash": "sp1", "name": "Laboratorio Clínico del Sur", "logoUrl": "/uploads/sponsors/sp1.webp" } ] }
GET
/api/sponsors/:idHash
Obtener un sponsor por su idHash
POST
/api/sponsors
Crear sponsor (multipart: image para logo)
# Request (multipart/form-data) POST /api/sponsors Authorization: Bearer eyJhbGciOi... name = "Laboratorio Clínico del Sur" image = [logo.png]
PUT
/api/sponsors/:idHash
Actualizar un sponsor (multipart: image)
DELETE
/api/sponsors/:idHash
Eliminar un sponsor (soft delete)
📅 Citas/api/citas
GET
/api/citas
Listar todas las citas médicas (requiere token)
# Request GET /api/citas Authorization: Bearer eyJhbGciOi... # Response 200 { "exito": true, "mensaje": "Citas obtenidas", "datos": [ { "idHash": "ct1", "fullName": "María López Gutiérrez", "email": "maria@email.com", "phone": "951234567", "message": "Consulta por dolor en el pecho", "status": "pending", "department": { "idHash": "dep1", "name": "Cardiología" } } ] }
GET
/api/citas/:idHash
Obtener una cita por su idHash (requiere token)
POST
/api/citas
Solicitar una cita (público, desde la web)
# Request (público — no requiere token) POST /api/citas Content-Type: application/json { "fullName": "María López Gutiérrez", "email": "maria@email.com", "phone": "951234567", "message": "Consulta por dolor en el pecho", "departmentId": 1 } # Response 201 { "exito": true, "mensaje": "Cita creada", "datos": { "idHash": "ct1", "status": "pending" } }
PUT
/api/citas/:idHash
Actualizar estado de una cita
DELETE
/api/citas/:idHash
Eliminar una cita (soft delete)
📄 Contenido Web/api/configuraciones
GET
/api/configuraciones
Listar todo el contenido web estático
# Response 200 { "exito": true, "mensaje": "Configuraciones obtenidas", "datos": [ { "idHash": "pg1", "settingKey": "hero_banner", "settingValue": { "fields": [ { "key": "titulo", "label": "Título principal", "value": "Clínica Vallecito", "type": "text" }, { "key": "subtitulo", "label": "Subtítulo", "value": "Tu salud es nuestra prioridad", "type": "text" } ], "image": "/uploads/configuraciones/hero_banner.webp" }, "department": null } ] }
GET
/api/configuraciones/:key
Obtener contenido web por su clave (settingKey)
POST
/api/configuraciones
Crear contenido web (multipart: image, campos dinámicos)
# Request (multipart/form-data) POST /api/configuraciones Authorization: Bearer eyJhbGciOi... settingKey = "hero_banner" settingValue = '{ "fields": [ { "key": "titulo", "label": "Título", "value": "Clínica Vallecito", "type": "text" }, { "key": "subtitulo", "label": "Subtítulo", "value": "Tu salud...", "type": "text" } ] }' departmentId = "" image = [banner.jpg] # Imagen opcional
PUT
/api/configuraciones/:key
Actualizar contenido web (campos + imagen sin perder datos)
# Actualizar campos y/o imagen (se mantienen ambos) PUT /api/configuraciones/hero_banner Authorization: Bearer eyJhbGciOi... settingValue = '{"fields":[...]}' image = [nueva_imagen.jpg] # Opcional _removeImage = "true" # Para quitar solo la imagen
DELETE
/api/configuraciones/:key
Eliminar contenido web (soft delete, limpia imagen)
🖼️ Galería de Imágenes/api/entity-images
GET
/api/entity-images?entityType=&entityIdHash=
Obtener galería de una entidad
# Request GET /api/entity-images?entityType=infrastructure&entityIdHash=inf1 # Response 200 { "exito": true, "mensaje": "Imágenes obtenidas", "datos": [ { "idHash": "img1", "imageUrl": "/uploads/gallery/img1.webp", "caption": "Vista frontal", "displayOrder": 0, "isVisible": true } ] }
POST
/api/entity-images
Subir imágenes a galería (multipart, hasta 20 archivos)
# Request (multipart/form-data) POST /api/entity-images Authorization: Bearer eyJhbGciOi... entityType = "infrastructure" entityIdHash = "inf1" images = [foto1.jpg, foto2.jpg, ...] # Hasta 20 archivos
PUT
/api/entity-images/reorder
Reordenar imágenes de la galería
# Request PUT /api/entity-images/reorder Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "images": [ { "idHash": "img2", "displayOrder": 0 }, { "idHash": "img1", "displayOrder": 1 } ] }
PUT
/api/entity-images/:idHash
Actualizar visibilidad o caption de una imagen
# Request PUT /api/entity-images/img1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "isVisible": false, "caption": "Vista lateral" }
DELETE
/api/entity-images/:idHash
Eliminar una imagen de la galería (soft delete, limpia archivo)