Título: Web Pedidos Klein - FastAPI Backend
Descripción: Backend para la aplicación Web Pedidos Klein utilizando FastAPI
URL Base: http://localhost:8000 (o su dominio de producción)
La API utiliza autenticación basada en tokens JWT. La mayoría de endpoints requieren autenticación a través del header:
Authorization: Bearer <token>
/api/users)/api/users/existsCuerpo de solicitud:
{
"id": 123
}
Respuestas:
200: Usuario existe404: Usuario no encontrado/api/users/registerCuerpo de solicitud:
{
"name": "Juan Pérez",
"email": "juan@ejemplo.com",
"rut": "12345678-9"
}
Respuestas:
201: Usuario registrado exitosamente400: Usuario ya existe/api/users/create-user?q={verification_code}q: Código de verificación recibido por emailCuerpo de solicitud:
{
"pin": "1234"
}
Respuestas:
201: Usuario creado exitosamente con token400: PIN inválido o código de verificación expirado/api/users/loginCuerpo de solicitud:
{
"email": "juan@ejemplo.com",
"pin": "1234"
}
Respuestas:
200: Login exitoso con datos de usuario y token401: Credenciales inválidas403: Usuario bloqueado por intentos fallidos429: Demasiados intentos de login/api/users/deleteCuerpo de solicitud:
{
"id": 123
}
Respuestas:
200: Usuario eliminado404: Usuario no encontrado/api/users/all200: Lista de usuarios/verify)/verify/?q={verification_code}q: Código de verificación200: Página de verificación HTML400: Código de verificación inválido/api/products)Requiere autenticación
/api/products/Authorization: Bearer <token>Respuestas:
200: Lista de productos
{
"products": [
{
"id": 1,
"name": "Producto 1",
"type": "bebida",
"description": "Descripción del producto",
"price": 1500.0,
"image": "url_imagen.jpg",
"status": 1,
"quantity": 1
}
],
"message": "Productos obtenidos correctamente"
}
/api/products/{product_id}Authorization: Bearer <token>product_id: ID del productoRespuestas:
200: Producto encontrado
{
"product": {
"id": 1,
"name": "Producto 1",
"type": "bebida",
"description": "Descripción del producto",
"price": 1500.0,
"image": "url_imagen.jpg",
"status": 1,
"quantity": 1
},
"message": "Productos obtenidos correctamente"
}
404: Producto no encontrado
/api/products/editAuthorization: Bearer <token>Cuerpo de solicitud:
{
"id": 1,
"name": "Producto Actualizado",
"type": "comida",
"description": "Nueva descripción",
"price": 2000.0,
"image": "nueva_imagen.jpg",
"status": 1,
"quantity": 5
}
Nota: Todos los campos excepto id son opcionales
Respuestas:
200: Producto editado exitosamente403: Sin permisos para realizar esta acción/api/products/createAuthorization: Bearer <token>Cuerpo de solicitud:
{
"name": "Nuevo Producto",
"type": "bebida",
"description": "Descripción del nuevo producto",
"price": 1800.0,
"image": "imagen_producto.jpg",
"status": 1,
"quantity": 10
}
Respuestas:
200: Producto creado exitosamente403: Sin permisos para realizar esta acción/api/products/{product_id}Authorization: Bearer <token>product_id: ID del producto a eliminar200: Producto eliminado exitosamente403: Sin permisos para realizar esta acción/api/orders)Requiere autenticación
/api/orders/sendAuthorization: Bearer <token>Cuerpo de solicitud:
{
"customerId": 123,
"items": [
{
"id": 1,
"quantity": 2
},
{
"id": 2,
"quantity": 1
}
],
"totalAmount": 4500.0,
"orderDate": "2025-07-31T10:30:00",
"table": 5
}
Respuestas:
200: Pedido procesado exitosamente400: Campos faltantes o tipo de mesa inválido404: Usuario no encontrado o venta activa no encontrada424: Impresora desconectada o error agregando productos/api/sales)Requiere autenticación
/api/sales/user/{user_id}Authorization: Bearer <token>user_id: ID del usuarioRespuestas:
200: Lista de ventas del usuario
{
"sales": [
{
"id": 1,
"user_id": 123,
"total": 4500.0,
"fudo_id": "abc123",
"date": "2025-07-31T10:30:00",
"table": 5,
"username": "Juan Pérez",
"user_email": "juan@ejemplo.com",
"products": [...]
}
],
"message": "Ventas obtenidas correctamente"
}
404: No se encontraron ventas
/api/chat)Requiere autenticación
/api/chat/completionsAuthorization: Bearer <token>Cuerpo de solicitud:
{
"messages": [
{
"role": "user",
"content": "Hola, ¿qué productos tienen disponibles?"
}
],
"user": "juan@ejemplo.com"
}
Respuestas:
200: Respuesta del chat
{
"response": "Respuesta generada por IA",
"message": "Respuesta de chat generada exitosamente"
}
500: Error interno del servidor
/200: Página HTML principal404: Archivo no encontrado/register200: Página HTML de registro404: Archivo no encontrado{
"id": 123,
"email": "usuario@ejemplo.com",
"name": "Nombre Usuario",
"rut": "12345678-9",
"pin_hash": "hashed_pin_value",
"kleincoins": "100.00",
"created_at": "2025-07-31T10:30:00"
}
{
"id": 1,
"name": "Nombre del Producto",
"type": "bebida",
"description": "Descripción del producto",
"price": 1500.0,
"image": "url_imagen.jpg",
"status": 1,
"quantity": 1
}
Campos:
id: Identificador úniconame: Nombre del productotype: Tipo/categoría del producto (opcional)description: Descripción del producto (opcional)price: Precio del productoimage: URL de la imagen (opcional)status: Estado del producto (0: Inactivo, 1: Activo)quantity: Cantidad disponible (opcional, por defecto 1){
"id": 1,
"name": "Producto Actualizado",
"type": "comida",
"description": "Nueva descripción",
"price": 2000.0,
"image": "nueva_imagen.jpg",
"status": 1,
"quantity": 5
}
Campos:
id: Identificador único (requerido)name: Nombre del producto (opcional)type: Tipo/categoría del producto (opcional)description: Descripción del producto (opcional)price: Precio del producto (opcional)image: URL de la imagen (opcional)status: Estado del producto (opcional) - 0: Inactivo, 1: Activoquantity: Cantidad disponible (opcional){
"name": "Nuevo Producto",
"type": "bebida",
"description": "Descripción del nuevo producto",
"price": 1800.0,
"image": "imagen_producto.jpg",
"status": 1,
"quantity": 10
}
Campos:
name: Nombre del producto (requerido)type: Tipo/categoría del producto (requerido)description: Descripción del producto (requerido)price: Precio del producto (requerido)image: URL de la imagen (requerido)status: Estado del producto (opcional, por defecto 1) - 0: Inactivo, 1: Activoquantity: Cantidad disponible (opcional, por defecto 1){
"customerId": 123,
"items": [
{
"id": 1,
"quantity": 2
}
],
"totalAmount": 3000.0,
"orderDate": "2025-07-31T10:30:00",
"table": 5
}
{
"id": 1,
"quantity": 2
}
{
"id": 1,
"user_id": 123,
"total": 3000.0,
"fudo_id": "abc123",
"date": "2025-07-31T10:30:00",
"table": 5,
"username": "Juan Pérez",
"user_email": "juan@ejemplo.com",
"products": [
{
"id": 1,
"name": "Producto 1",
"price": 1500.0,
"quantity": 2
}
]
}
{
"role": "user",
"content": "¿Qué productos tienen disponibles?"
}
Roles disponibles: user, assistant, system
{
"messages": [
{
"role": "user",
"content": "Hola, necesito ayuda"
}
],
"user": "usuario@ejemplo.com"
}
{
"id": 1,
"user_id": 123,
"email": "usuario@ejemplo.com",
"name": "Juan Pérez",
"rut": "12345678-9"
}
Campos:
id: Identificador únicouser_id: ID del usuario en lista negraemail: Email del usuario (opcional)name: Nombre del usuario (opcional)rut: RUT del usuario (opcional){
"name": "Juan Pérez",
"email": "juan@ejemplo.com",
"rut": "12345678-9"
}
{
"email": "juan@ejemplo.com",
"pin": "1234"
}
{
"pin": "1234"
}
Validación: PIN debe ser exactamente 4 dígitos
{
"id": 123
}
/express/ - Archivos de la aplicación principal/register/ - Archivos de la página de registro