Endpoints - FactoriaF5-Asturias/project-p5-digital-academy-team3-restaurant-backend GitHub Wiki
Endpoints
La API de Giacobello usa el prefijo /api/v1, configurado en la propiedad api-endpoint.
En esta documentación se indican las respuestas más habituales de cada endpoint. Algunas respuestas de error las genera nuestro código y otras las genera Spring automáticamente, por ejemplo cuando faltan campos obligatorios en el body. Por eso el formato del JSON de error puede cambiar según el caso.
Pública significa que no requiere token. Las demás rutas requieren un JWT en
Authorization: Bearer <token> y los roles indicados.
| Método | Endpoint | Acceso | Entrada | Respuesta correcta | Errores relevantes |
|---|---|---|---|---|---|
| POST | /api/v1/auth/token |
Público |
username, password
|
200: token JWT |
400, 401, 409
|
| POST | /api/v1/auth/change-password |
Público |
username, currentPassword, newPassword
|
200: token JWT |
400, 401, 409
|
| GET | /api/v1/products |
Público | — |
200: productos activos, ordenados por nombre |
500 |
| GET | /api/v1/admin/products |
Token Bearer ADMIN
|
Lista de productos activos e inactivos |
200: ok |
401, 403, 500 |
| GET | /api/v1/products/{id} |
Público | ID de producto |
200: producto |
400, 404
|
| POST | /api/v1/products |
ADMIN |
name, description, categoryId, price, imageUrl, status
|
201: producto creado |
400, 401, 403, 404, 409
|
| PUT | /api/v1/products/{id} |
ADMIN |
ID y datos del producto |
200: producto actualizado |
400, 401, 403, 404, 409
|
| DELETE | /api/v1/products/{id} |
ADMIN |
ID de producto |
204: sin contenido; desactiva el producto (status=false) |
401, 403, 404
|
| GET | /api/v1/categories |
Público | — |
200: categorías, ordenadas por nombre |
500 |
| GET | /api/v1/categories/{id} |
Público | ID de categoría |
200: categoría |
400, 404
|
| POST | /api/v1/categories |
ADMIN |
name |
201: categoría creada |
400, 401, 403, 409
|
| PUT | /api/v1/categories/{id} |
ADMIN |
ID y name
|
200: categoría actualizada |
400, 401, 403, 404, 409
|
| DELETE | /api/v1/categories/{id} |
ADMIN |
ID de categoría |
204: sin contenido |
401, 403, 404, 409
|
| GET | /api/v1/tablets |
Público | — |
200: lista de tablets/mesas, ordenada por nombre |
500 |
| GET | /api/v1/tablets/{id} |
Público | ID de tablet |
200: tablet |
400, 500
|
| GET | /api/v1/paymentmethod |
Público | — |
200: métodos de pago (actualmente CASH, CARD) |
500 |
| POST | /api/v1/orders |
Público |
tabletId, orderTypeName, paymentMethodName, items[]
|
201: pedido creado con líneas e invoice |
400, 409, 500
|
| GET | /api/v1/orders |
KITCHEN, ADMIN
|
— |
200: lista de pedidos |
401, 403
|
| GET | /api/v1/orders/{id} |
KITCHEN, ADMIN
|
ID de pedido |
200: pedido y líneas |
400, 401, 403, 404
|
| PUT | /api/v1/orders/{id}/status |
KITCHEN, ADMIN
|
ID y statusName
|
200: pedido actualizado |
400, 401, 403, 404, 409
|
| GET | /api/v1/orders/{id}/invoice |
KITCHEN, ADMIN
|
ID de pedido |
200: invoice en JSON |
400, 401, 403, 404
|
| PUT | /api/v1/orders/{id}/pay |
Público | id del pedido (sin body) |
200: Pedido actualizado como pagado |
404, 409
|
| GET | /api/v1/invoices |
ADMIN |
— |
200: lista de invoices en JSON; [] si está vacía |
401, 403
|
IMPORTANTE: Arrancar el backend con el boton Run Java desde GiacobelloApplication.java y asegurar que se ha iniciado.
- En Postman seleccionar método POST y esta URL:
http://localhost:8080/api/v1/auth/token
- En Headers, añadir
Content-Type: application/json. - En Body, seleccionar raw y JSON, y enviar las credenciales:
{
"username": "Kitchen",
"password": "tu-contraseña"
}- Con credenciales válidas, la respuesta es 200 OK:
{
"token": "eyJ..."
}Si el usuario o la contraseña no son válidos, responde 401 Unauthorized. Los campos vacíos responden 400 Bad Request. No requiere autenticación previa.
Este endpoint se usa solo cuando una cuenta tiene pendiente cambiar su
contraseña inicial. Antes de usarlo, POST /api/v1/auth/token debe responder
409 Conflict para esa cuenta.
- En Postman seleccionar método POST y esta URL:
http://localhost:8080/api/v1/auth/change-password
- En Headers, añadir
Content-Type: application/json. - En Body, seleccionar raw y JSON, y enviar:
{
"username": "Admin",
"currentPassword": "contraseña-actual",
"newPassword": "nueva-contraseña"
}- Si el cambio es correcto, responde 200 OK y devuelve un token JWT:
{
"token": "eyJ..."
}Si la contraseña actual no es correcta, responde 401 Unauthorized. Si la
nueva contraseña no cumple la validación o es igual a la anterior, responde
400 Bad Request. Si la cuenta ya no tiene pendiente el cambio inicial,
responde 409 Conflict y debe iniciar sesión en POST /api/v1/auth/token.
Para probar conexion y peticion a POST /api/v1/orders
- Comprobar que el header de peticion contiene:
Content-Type: application/json
- Enviar el body con los siguientes datos:
{
"tabletId": 2,
"orderTypeName": "DINE IN",
"paymentMethodName": "CASH",
"items": [
{
"productId": 4,
"quantity": 2
},
{
"productId": 7,
"quantity": 1
}
]
}
- Respuesta tiene quer ser: 201 ok, significa que el order ha sido creado. Para verlo usar otro endpoint GET api/v1/orders o GET /api/orders/{id}.
-
Insertar id del pedido del que hay qie cambiar el status.
-
Enviar el body con los siguientes datos y eligiendo raw ->JSON:
{
"statusName": "ACCEPTED"
}
- Resultado esperado: 200 OK y el pedido con statusName: "ACCEPTED". Para verlo usar otro endpoint GET api/v1/orders o GET /api/orders/{id}.
Las rutas actuales usan el prefijo /api/v1. Estos endpoints devuelven datos
JSON, no PDF. Para probar sin autenticación la factura de un pedido, arrancar
con el perfil local.
Para probar conexión y petición a GET /api/v1/invoices:
- En Postman seleccionar método GET, No Auth y esta URL:
http://localhost:8080/api/v1/invoices
-
No enviar body, se queda en vacio.
-
La respuesta tiene que ser 200 OK con una lista de facturas. Estos datos son un ejemplo:
[
{
"id": 3,
"orderId": 5,
"invoiceNumber": "TEST-5",
"totalAmount": 25.0,
"issuedAt": "2026-09-16T12:00:00"
}
]Si no hay facturas, devuelve 200 OK con []. El listado actualmente permite
acceso sin autenticación también sin el perfil local.
Para probar conexión y petición a GET /api/v1/orders/{id}/invoice:
- Consultar primero
GET /api/v1/invoicesy copiar el orderId de una factura. En Postman seleccionar método GET, No Auth y sustituir5por ese ID:
http://localhost:8080/api/v1/orders/5/invoice
-
No enviar body, se queda en vacio.
-
La respuesta tiene que ser 200 OK con
[]si existe la factura o 404 si no existe(de momento es asi y es correcto ya que no tenemos facturas). Estos datos son un ejemplo:
{
"id": 3,
"orderId": 5,
"invoiceNumber": "TEST-5",
"totalAmount": 25.0,
"issuedAt": "2026-09-16T12:00:00"
}La URL usa el ID del pedido (5), no el ID de la factura (3).
Si el pedido no existe o no tiene factura, devuelve 404 Not Found.
Al crear un pedido válido mediante POST /api/v1/orders, el backend crea de
forma atómica la factura asociada en invoices, con el total del pedido y su
fecha de emisión. Por tanto, el orderId devuelto por el POST se puede usar
directamente en este endpoint.
- Si aparece 403, comprobar que el perfil
localestá activo y la ruta está permitida enSecurityConfig. Si aparece 404 en el listado, revisar la URL y reiniciar el backend después de los cambios. Si no conecta, comprobar que el backend está arrancado en el puerto8080.
| Código | Nombre | Qué significa | Ejemplo en nuestra API |
|---|---|---|---|
400 |
Bad Request |
La petición está mal formada o faltan datos obligatorios. El backend entiende la ruta, pero el body o los parámetros no son válidos. | Enviar un producto sin name, un precio negativo o un pedido sin items. |
401 |
Unauthorized |
No estás autenticado. Puede faltar el token, el token puede estar mal escrito, caducado o las credenciales del login son incorrectas. | Hacer GET /orders sin Authorization: Bearer <token> o hacer login con contraseña incorrecta. |
403 |
Forbidden |
Estás autenticado, pero tu rol no tiene permisos para esa acción. | Entrar con usuario KITCHEN e intentar crear un producto, que solo puede hacer ADMIN. |
404 |
Not Found |
El recurso solicitado no existe. La ruta puede existir, pero el ID no corresponde a ningún registro. | Buscar GET /products/9999 si no existe ese producto. |
409 |
Conflict |
La petición está bien escrita, pero choca con una regla de negocio. | Nombre de producto duplicado, categoría con productos asociados, producto desactivado en un pedido o contraseña inicial pendiente. |
500 |
Internal Server Error |
Error inesperado del backend. Normalmente significa que algo no está controlado todavía en el código. | Error de servidor, configuración incorrecta o excepción no manejada. |
Se puede consultar la lista completa de los endpoins en los siguientes enlaces:
SWAGGER: http://localhost:8080/swagger-ui/index.html
JSON: http://localhost:8080/v3/api-docs
NOTA: Para visualizar estos datos el servicio backend debe estar activo.