General
Endpoints Generales
Endpoints generales del sistema Ambrosia POS que proporcionan información básica y configuración.
Endpoint Raíz
GET /
Endpoint raíz de la API.
Authorization: No requiere autenticación.
cURL Example:
curl -X GET "http://127.0.0.1:9154/"
Response Body (200 OK):
"Root path of the API Nothing to see here"
Health
GET /api/health
Verifica que el servidor está en ejecución.
Authorization: No requiere autenticación.
cURL Example:
curl -X GET "http://127.0.0.1:9154/api/health"
Response Body (200 OK):
{
"status": "healthy",
"timestamp": "1712150400000"
}
Configuración Inicial
Estos endpoints gestionan el proceso de primera configuración del sistema. Solo son relevantes en el primer arranque.
GET /initial-setup
Verifica si el sistema ya fue inicializado.
Authorization: No requiere autenticación.
cURL Example:
curl -X GET "http://127.0.0.1:9154/initial-setup"
Response Body (200 OK):
{
"initialized": false,
"needsBusinessType": false
}
POST /initial-setup
Ejecuta la configuración inicial — crea el rol admin, el primer usuario y guarda los datos del negocio. Si el sistema ya fue inicializado pero falta confirmar el tipo de negocio, este endpoint también lo resuelve.
Authorization: No requiere autenticación.
Request Body (primera configuración):
{
"businessType": "restaurant",
"businessName": "Mi Negocio",
"businessCurrency": "USD",
"userName": "admin",
"userPassword": "S3cur3P4ssw0rd!!",
"userPin": "1234",
"businessAddress": "string (opcional)",
"businessPhone": "string (opcional)",
"businessEmail": "string (opcional)",
"businessTaxId": "string (opcional)",
"businessRFC": "string (opcional, alias de businessTaxId)",
"businessLogoUrl": "string (opcional)",
"businessLogo": "string (opcional, alias de businessLogoUrl)"
}
Request Body (solo confirmar tipo de negocio):
{
"businessType": "store"
}
cURL Example:
curl -X POST "http://127.0.0.1:9154/initial-setup" \
-H "Content-Type: application/json" \
-d '{
"businessType": "restaurant",
"businessName": "Mi Restaurante",
"businessCurrency": "USD",
"userName": "admin",
"userPassword": "S3cur3P4ssw0rd!!",
"userPin": "1234"
}'
Response Body (201 Created):
{
"message": "Initial setup completed",
"userId": "f9b9d411-590f-4d10-a164-0173805857de",
"roleId": "70d96869-b363-4b5f-a972-897afd30a68c"
}
userId y roleId son UUID (string), no enteros.
Response Body (400 Bad Request): datos faltantes o tipo de negocio inválido.
{ "message": "Invalid business type" }
Response Body (404 Not Found): acrónimo de moneda desconocido.
{ "message": "Unknown currency acronym: XYZ" }
Response Body (409 Conflict): sistema ya inicializado.
{ "message": "Initial setup already completed" }
Códigos de Estado HTTP
Éxito (2xx)
- 200 OK: Operación exitosa. Las listas vacías también devuelven
200con un string descriptivo (ej."No orders found"). - 201 Created: Recurso creado exitosamente.
- 202 Accepted: Operación aceptada pero aún no completada (ej.
POST /store/orders/checkout-if-paidcon pago Lightning sin confirmar →{ "status": "pending" }). - 204 No Content: Sin cuerpo. Se usa en los
DELETEexitosos (exceptoDELETE /store/orders/{id}) y enGET /shifts/opencuando no hay turno abierto.
Error del Cliente (4xx)
- 400 Bad Request: Parámetros faltantes o inválidos.
- 401 Unauthorized: No autenticado o token inválido.
- 403 Forbidden: Permisos insuficientes (
Permission required,Admin privileges required,Wallet access required). - 404 Not Found: Recurso no encontrado.
- 409 Conflict: Conflicto de estado — SKU duplicado, nombre de usuario/rol duplicado, turno ya abierto, borrado del último admin, etc.
- 429 Too Many Requests: Límite de intentos de login. Incluye la cabecera
Retry-Aftery{ "retryAfter": <segundos> }.
Error del Servidor (5xx)
- 500 Internal Server Error: Error interno del servidor.
- 503 Service Unavailable: Servicio externo no disponible (nodo Phoenix o impresión).
Formato de Datos
Timestamps
- Los timestamps suelen ser Unix en milisegundos (ej.
1753549837824), enviados/recibidos como string o número según el campo. Algunas fechas usan ISO 8601 (2025-01-15T14:30:00Z).
Identificadores
- Tipo: UUID v4.
- Ejemplo:
76ee1086-b945-4170-b2e6-9fbeb95ae0be.
Monedas y Cantidades
- Los importes del módulo restaurant se expresan como decimales (ej.
45.50). - Los importes del módulo Store (productos, checkout, reportes) se expresan como enteros en centavos (ej.
25000= $250.00). - Montos Lightning en satoshis.
Autenticación
- Tipo: JWT en cookies HTTP.
- accessToken (
auth-jwt): operaciones estándar de la API. Duración ~1 minuto. - refreshToken: renueva el access token. Duración 30 días.
- walletAccessToken (
auth-jwt-wallet): requerido por la mayoría de endpoints/wallet/*. Se obtiene enPOST /wallet/auth. - Endpoints:
POST /auth/login,POST /auth/refresh,POST /auth/logout.
Paginación
Algunos endpoints (p. ej. los de /wallet/payments/*) soportan paginación:
- limit (int): máximo de resultados (por defecto: 20).
- offset (int): resultados a omitir (por defecto: 0).
- all (boolean): mostrar todos sin paginación.
curl -X GET "http://127.0.0.1:9154/wallet/payments/incoming?limit=10&offset=20" \
-H "Cookie: accessToken=$ACCESS_TOKEN" \
-H "Cookie: walletAccessToken=$WALLET_ACCESS_TOKEN"
/wallet/payments/incoming requiere walletAccessToken además del accessToken.
Filtros Comunes
La mayoría de los query params de filtro usan camelCase (userId, paymentMethod, minTotal, startDate, endDate, sortBy, sortOrder).
Excepciones en snake_case (por cómo las lee el servidor):
user_idenGET /shifts/open.start_date/end_dateenGET /orders/date-range.- La clave
total_salesen la respuesta deGET /orders/total-sales/{date}.
Los endpoints de wallet usan from / to (timestamps) para filtrar por fecha.
Manejo de Errores
Los errores gestionados por el manejador central devuelven un objeto:
{ "message": "Descripción del error" }
Excepciones:
- Algunas validaciones a nivel de ruta responden con un string plano (ej.
"Missing or malformed ID","There is already an open shift"). - Los errores de Phoenix devuelven
WalletErrorResponse:{ "message": "...", "code": <int?>, "source": "..." }.
Entornos
- Desarrollo: URL base
http://127.0.0.1:9154, SQLite local. - Producción: URL según despliegue, HTTPS obligatorio.
Tipos de Datos Personalizados
Estados de Mesa
available,occupied,reserved.
Estados de Orden
open,closed,paid(valores válidos del campostatusde una orden).
Estados de Plato (preparación)
- El
statusde unOrderDishrefleja el flujo de cocina (por ejemplopending); cada plato incluye ademásshouldPrepare.
Estados de Ticket
1Pendiente,2Pagado,3Cancelado.
Integración Bitcoin Lightning
El sistema incluye integración con Bitcoin Lightning Network a través del servicio Phoenix: crear facturas, procesar pagos, consultar balance/transacciones y pagos on-chain. Ver Wallet.
Seguridad
- PIN: se almacenan con PBKDF2WithHmacSHA256 (10.000 iteraciones, clave de 256 bits), usando la clave maestra de la app + el nombre de usuario como salt (
SecurePinProcessor.hashPinForStorage()). - JWT: firmados con clave secreta.
- Cookies HttpOnly: para mitigar XSS.
- Producción: HTTPS obligatorio, certificados SSL válidos, backups regulares y monitoreo.