Referencia de la API
Tabla de rutas del sidecar Fastify (los rutas-*.ts de cada dominio de
server/). El servidor escucha solo
en 127.0.0.1:3001. Salvo las rutas públicas, todas exigen
Authorization: Bearer <JWT>; algunas exigen además el rol gerente
(marcadas con 🔒).
Esta tabla se extrajo del código real. Los cuerpos/parámetros se validan con Zod en cada handler.
Autenticación y setup
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| GET | /health | Estado del servidor (usado por el health-gate de Tauri). | Público |
| POST | /api/auth/login | Inicia sesión (email + contraseña); devuelve JWT. Con rate-limit. | Público |
| GET | /api/auth/me | Devuelve el usuario actual; revalida que siga activo. | Token |
| GET | /api/setup/status | ¿La app necesita configuración inicial? (sin usuarios). | Público |
| POST | /api/setup | Crea el primer gerente + datos del gym (solo con 0 usuarios). | Público* |
* Se auto-protege: responde 403 si ya existe algún usuario.
Recuperación asistida
Flujo para recuperar el acceso cuando el cliente perdió contraseña y correo. Ver Recuperación asistida de acceso. Rutas públicas con rate-limit por IP; la mutación solo ocurre tras verificar una autorización firmada (Ed25519) por el desarrollador.
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| POST | /api/recovery/request | Genera una solicitud (requestCode + requestBlob con correos enmascarados). | Público |
| POST | /api/recovery/preview | Valida la autorización firmada sin aplicar; devuelve a qué gerente apunta. | Público |
| POST | /api/recovery/apply | Verifica la autorización y fija nuevo correo/contraseña del gerente (reactiva si estaba inactivo). | Público |
Verificación fail-closed: firma EdDSA válida,
expobligatorio,installationIdcontra DB, solicitudpendingy no vencida,targetUserIdfirmado y nonce de un solo uso. Cada intento queda en la bitácora (recovery.*).
Miembros
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| GET | /api/members | Lista miembros (filtros archived, search); marca pagos pendientes. | Token |
| GET | /api/members/:id | Detalle del miembro con pagos y mensajes WhatsApp. | Token |
| POST | /api/members | Alta con plan inicial + primer pago (transacción atómica). | Token |
| PATCH | /api/members/:id | Edita datos básicos; archivar requiere gerente. | Token / 🔒 |
| POST | /api/members/:id/renew | Renueva la membresía (aplica reglas de fecha). | Token |
Membresías (planes)
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| GET | /api/memberships | Lista planes activos. | Token |
| POST | /api/memberships | Crea un plan. | 🔒 |
| PATCH | /api/memberships/:id | Edita un plan. | 🔒 |
| DELETE | /api/memberships/:id | Borra/desactiva un plan (lógico si tiene miembros). | 🔒 |
Pagos y transacciones
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| POST | /api/payments/:id/confirm | Confirma un pago pendiente (registra ID externo; el trigger WhatsApp asociado permanece experimental). | 🔒 |
| GET | /api/transactions | Lista movimientos (filtros tipo/periodo/estado/búsqueda). | Token |
| POST | /api/transactions | Registra un movimiento; gastos requieren gerente. | Token / 🔒 |
| POST | /api/transactions/:id/confirm | Confirma una venta pendiente (tarjeta/transferencia). | Token |
| POST | /api/transactions/:id/void | Anula un movimiento confirmado (crea gemela compensatoria). | 🔒 |
| GET | /api/sales/:id | Devuelve la compra completa agrupada, sus líneas, devoluciones y totales. | Token |
| POST | /api/sales/:id/void | Anula una compra completa, compensa sus líneas y repone stock. | 🔒 |
| POST | /api/sales/:id/returns | Registra una devolución parcial por cantidades, método y motivo. | 🔒 |
| GET | /api/customers/:id/credit | Consulta el crédito a favor local de un cliente. | Token |
| GET | /api/categories | Lista categorías (`kind=product | expense`). |
Productos y ventas
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| GET | /api/products | Lista productos del inventario. | Token |
| POST | /api/products | Crea un producto. | 🔒 |
| PATCH | /api/products/:id | Edita un producto. | 🔒 |
| DELETE | /api/products/:id | Borra/desactiva un producto. | 🔒 |
| POST | /api/categories | Crea una categoría (producto o gasto). | 🔒 |
| DELETE | /api/categories/:id | Borra una categoría. | 🔒 |
| POST | /api/sales | Registra una venta de productos (POS, varios items, descuenta stock). | Token |
| GET | /api/products/:id/inventory-movements | Lista el libro de movimientos de existencias de un producto. | 🔒 |
| POST | /api/products/:id/inventory-adjustments | Registra reposición o corrección de conteo con nota obligatoria. | 🔒 |
Confirmado contra
server/dinero/rutas-products.tsyserver/dinero/rutas-returns.ts:GET /api/productsyPOST /api/salesusan solo token (recepción puede vender); catálogo, devoluciones, anulación completa y ajustes de existencias son solo gerente (🔒, víarequireGerente). La confirmación de tarjeta/transferencia se hace por la línea pendiente pero reclama la identidad deSalepara confirmar toda la compra de forma atómica.
Reportes
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| GET | /api/reports/monthly | Reporte de 6 meses + desgloses del mes (legacy). | Token |
| GET | /api/reports/range | Reporte por rango from/to; deltas, serie, desgloses. | Token |
| GET | /api/dashboard/summary | Resumen para el tablero principal. | Token |
Gimnasio, usuarios y configuración
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| GET | /api/gym | Datos del gimnasio (nombre, dirección, logo…). | Token |
| PATCH | /api/gym | Edita los datos del gimnasio. | 🔒 |
| GET | /api/users | Lista usuarios del sistema. | 🔒 |
| POST | /api/users | Crea un usuario (gerente/recepción). | 🔒 |
| PATCH | /api/users/:id | Edita/activa/desactiva un usuario. | 🔒 |
| DELETE | /api/users/:id | Elimina un usuario. | 🔒 |
| GET | /api/settings | Lee configuración de infraestructura (carpeta de respaldo). | 🔒 |
| GET | /api/settings/summary | Resume estados y contadores del índice de Ajustes en una sola petición. | 🔒 |
| PATCH | /api/settings | Edita la configuración de infraestructura. | 🔒 |
| GET | /api/notifications/background | Lista liviana de DTE no validados y pruebas de WhatsApp fallidas que alimentan la campana persistente. | 🔒 |
Confirmado contra
server/gimnasio/rutas-gym.ts,server/acceso/rutas-users.tsyserver/gimnasio/rutas-settings.ts:GET /api/gymusa token;PATCH /api/gym, todas las rutas de/api/users(incluidoGET) yGET/PATCH /api/settingsson solo gerente (🔒, víarequireGerente).
Facturación electrónica (DTE)
Contrato local, no integración fiscal. En la versión actual toda emisión devuelve
modo="SIMULACION"yestadoMh=null. Ninguna ruta firma, transmite, consulta ni obtiene acuse del Ministerio de Hacienda.
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| GET | /api/dte/config | Lee la configuración fiscal del emisor. | 🔒 |
| PATCH | /api/dte/config | Actualiza datos del emisor usados por la simulación. | 🔒 |
| GET | /api/facturas | Listado paginado por mes, filtros y resumen mensual. | 🔒 |
| GET | /api/dte | Lista local de DTE de simulación con sus metadatos. | 🔒 |
| GET | /api/dte/transaction/:transactionId | Busca el DTE 01/03 de un movimiento sin descargar el listado completo. | 🔒 |
| GET | /api/dte/:id | Devuelve el documento local completo y metadatos de simulación. | 🔒 |
| POST | /api/dte/emit | Genera localmente Factura (01) o Crédito Fiscal (03) para una transacción. | 🔒 |
| POST | /api/dte/:id/invalidacion | Registra un evento local de invalidación (tipoAnulacion=2); no lo transmite. | 🔒 |
| POST | /api/dte/:id/nota-credito | Ruta legado: responde 501 y no muta datos. | 🔒 |
Confirmado contra
server/facturas/rutas-dte.ts: todo el módulo es solo gerente. Generar un DTE rechaza transacciones que ya tienen documento activo. Los motivos de invalidación que exigen reemplazo permanecen bloqueados; la ruta histórica de Nota de Crédito no es una vía de corrección vigente.
WhatsApp (Twilio)
Backend experimental. Implementa cifrado, ping, envío con body libre, webhook firmado y logs. No implementa
ContentSid/ContentVariables, no registra consentimiento/opt-in del miembro y no constituye una integración de producción.
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| GET | /api/wa/templates | Lista plantillas de mensajes. | 🔒 |
| POST | /api/wa/templates | Crea una plantilla. | 🔒 |
| PATCH | /api/wa/templates/:id | Edita una plantilla. | 🔒 |
| DELETE | /api/wa/templates/:id | Elimina una plantilla. | 🔒 |
| GET | /api/wa/log | Bitácora de mensajes enviados (filtro por estado). | 🔒 |
| GET | /api/wa/config | Configuración de Twilio (sin exponer el token). | 🔒 |
| PATCH | /api/wa/config | Edita config de Twilio (cifra el token at-rest). | 🔒 |
| POST | /api/wa/ping | Verifica credenciales de Twilio sin enviar. | 🔒 |
| POST | /api/wa/test | Envía body libre sólo para una prueba controlada (sandbox). | 🔒 |
| POST | /api/wa/send | Ejecuta una prueba de plantilla exclusivamente contra el teléfono de sandbox guardado y registra el intento. | 🔒 |
| POST | /api/wa/trigger-now | Ruta interna/legado para ejecutar el motor experimental; no se expone en el rediseño. | 🔒 |
| POST | /api/wa/webhook | Webhook de Twilio: valida firma y actualiza estado de entrega. | Público |
El backend automático permanece desactivado con twilioConnected=false. Para
producción faltan sender registrado, plantillas aprobadas, consentimiento
verificable, callback HTTPS público y QA E2E real.
Bitácora y respaldo
| Método | Ruta | Propósito | Acceso |
|---|---|---|---|
| GET | /api/audit | Bitácora administrativa (últimas 200 acciones, con actor). | 🔒 |
| GET | /api/backup/status | Estado del último respaldo. | 🔒 |
| POST | /api/backup/now | Respalda ahora (snapshot manual). | 🔒 |
| POST | /api/backup/restore | Prepara una restauración (se aplica al reiniciar). | 🔒 |