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.

Rutas implementadas

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

Probar peticiones de endpoints con Postman

IMPORTANTE: Arrancar el backend con el boton Run Java desde GiacobelloApplication.java y asegurar que se ha iniciado.

Probar autenticación

POST /api/v1/auth/token

  1. En Postman seleccionar método POST y esta URL:
http://localhost:8080/api/v1/auth/token
  1. En Headers, añadir Content-Type: application/json.
  2. En Body, seleccionar raw y JSON, y enviar las credenciales:
{
  "username": "Kitchen",
  "password": "tu-contraseña"
}
  1. 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.

POST /api/v1/auth/change-password

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.

  1. En Postman seleccionar método POST y esta URL:
http://localhost:8080/api/v1/auth/change-password
  1. En Headers, añadir Content-Type: application/json.
  2. En Body, seleccionar raw y JSON, y enviar:
{
  "username": "Admin",
  "currentPassword": "contraseña-actual",
  "newPassword": "nueva-contraseña"
}
  1. 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.

Probar peticiones de pedidos

POST /api/v1/orders

Para probar conexion y peticion a POST /api/v1/orders

  1. Comprobar que el header de peticion contiene:

Content-Type: application/json

  1. Enviar el body con los siguientes datos:
{
  "tabletId": 2,
  "orderTypeName": "DINE IN",
  "paymentMethodName": "CASH",
  "items": [
    {
      "productId": 4,
      "quantity": 2
    },
    {
      "productId": 7,
      "quantity": 1
    }
  ]
}
  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}.

PUT /api/v1/orders/{id}/status

  1. Insertar id del pedido del que hay qie cambiar el status.

  2. Enviar el body con los siguientes datos y eligiendo raw ->JSON:

{
  "statusName": "ACCEPTED"
}
  1. Resultado esperado: 200 OK y el pedido con statusName: "ACCEPTED". Para verlo usar otro endpoint GET api/v1/orders o GET /api/orders/{id}.

Probar peticiones de facturas

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.

GET /api/invoices

Para probar conexión y petición a GET /api/v1/invoices:

  1. En Postman seleccionar método GET, No Auth y esta URL:
http://localhost:8080/api/v1/invoices
  1. No enviar body, se queda en vacio.

  2. 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.

GET /api/orders/{id}/invoice

Para probar conexión y petición a GET /api/v1/orders/{id}/invoice:

  1. Consultar primero GET /api/v1/invoices y copiar el orderId de una factura. En Postman seleccionar método GET, No Auth y sustituir 5 por ese ID:
http://localhost:8080/api/v1/orders/5/invoice
  1. No enviar body, se queda en vacio.

  2. 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.

  1. Si aparece 403, comprobar que el perfil local está activo y la ruta está permitida en SecurityConfig. 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 puerto 8080.

Errores Más Comunes

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.

Documentación API

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.

⚠️ **GitHub.com Fallback** ⚠️