diff --git a/Api/main.py b/Api/main.py index be8f0fb..1c5831c 100644 --- a/Api/main.py +++ b/Api/main.py @@ -1,8 +1,14 @@ import json -from fastapi import FastAPI, Response +import logging +from typing import Dict, Any, Tuple +from fastapi import FastAPI, HTTPException from pydantic import BaseModel from formats import print_bill, print_customer_order +# Configurar logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + app = FastAPI( title="Print Server FastAPI", description="Server that receive request for printing", @@ -10,49 +16,103 @@ app = FastAPI( ) -class Info(BaseModel): +class PrintRequest(BaseModel): content: str ip_printer: str user_name: str -@app.post("/print_bill") -def print_ticket_bill(info: Info): - info = dict(info) - data = info["content"] - address = info["ip_printer"] - waiter = info["user_name"] - data = json.loads(data.replace("'", "\"")) - print_bill(data, address, waiter) - - message = "!Impresion Realizada!" - - return Response(content=message, status_code=200) +class PrintResponse(BaseModel): + message: str + success: bool + print_type: str -@app.post("/order_kitchen") -def print_ticket_file_kitchen(info: Info): - info = dict(info) - data = info["content"] - address = info["ip_printer"] - waiter = info["user_name"] - data = json.loads(data.replace("'", "\"")) - print_customer_order(data, address, waiter) +def _parse_request_data(info: PrintRequest) -> Tuple[Dict[str, Any], str, str]: + """Parse and validate request data with better error handling""" + try: + content_clean = info.content.replace("'", "\"") + data = json.loads(content_clean) - message = "!Impresion Realizada!" + logger.info( + f"Print request from {info.user_name} to {info.ip_printer}") + return data, info.ip_printer, info.user_name - return Response(content=message, status_code=200) + except json.JSONDecodeError as e: + logger.error(f"JSON decode error: {str(e)}") + raise HTTPException(status_code=400, detail="Invalid JSON format") + except ValueError as e: + logger.error(f"Validation error: {str(e)}") + raise HTTPException(status_code=400, detail=str(e)) + except Exception as e: + logger.error(f"Unexpected error parsing request: {str(e)}") + raise HTTPException(status_code=400, detail="Error processing request") -@app.post("/order_bar") -def print_ticket_file_bar(info: Info): - info = dict(info) - data = info["content"] - address = info["ip_printer"] - waiter = info["user_name"] - data = json.loads(data.replace("'", "\"")) - print_customer_order(data, address, waiter) +@app.post("/print_bill", response_model=PrintResponse) +def print_ticket_bill(info: PrintRequest) -> PrintResponse: + """Print bill ticket""" + try: + data, address, waiter = _parse_request_data(info) + print_bill(data, address, waiter) - message = "!Impresion Realizada!" + logger.info(f"Bill printed successfully for {waiter}") + return PrintResponse( + message="✅ Impresión de cuenta realizada exitosamente!", + success=True, + print_type="bill" + ) + except Exception as e: + logger.error(f"Error printing bill: {str(e)}") + raise HTTPException(status_code=500, detail="Error printing bill") - return Response(content=message, status_code=200) + +@app.post("/order_kitchen", response_model=PrintResponse) +def print_ticket_kitchen(info: PrintRequest) -> PrintResponse: + """Print kitchen order""" + try: + data, address, waiter = _parse_request_data(info) + print_customer_order(data, address, waiter) + + logger.info(f"Kitchen order printed successfully for {waiter}") + return PrintResponse( + message="✅ Pedido de cocina impreso exitosamente!", + success=True, + print_type="kitchen" + ) + except Exception as e: + logger.error(f"Error printing kitchen order: {str(e)}") + raise HTTPException( + status_code=500, detail="Error printing kitchen order") + + +@app.post("/order_bar", response_model=PrintResponse) +def print_ticket_bar(info: PrintRequest) -> PrintResponse: + """Print bar order""" + try: + data, address, waiter = _parse_request_data(info) + print_customer_order(data, address, waiter) + + logger.info(f"Bar order printed successfully for {waiter}") + return PrintResponse( + message="✅ Pedido de barra impreso exitosamente!", + success=True, + print_type="bar" + ) + except Exception as e: + logger.error(f"Error printing bar order: {str(e)}") + raise HTTPException(status_code=500, detail="Error printing bar order") + + +@app.get("/health") +def health_check() -> Dict[str, str]: + return { + "status": "healthy", + "service": "print_server", + "version": "0.0.1" + } + + +@app.get("/") +def root() -> Dict[str, str]: + return {"message": "Print Server API is running"} diff --git a/Api/test/test_main.py b/Api/test/test_main.py index 145949f..4ebf1c9 100644 --- a/Api/test/test_main.py +++ b/Api/test/test_main.py @@ -20,7 +20,14 @@ def test_print_bill(): response = client.post("/print_bill", json=test_info) assert response.status_code == 200 - assert response.content.decode() == "!Impresion Realizada!" + + response_data = response.json() + expected_data = { + "message": "✅ Impresión de cuenta realizada exitosamente!", + "success": True, + "print_type": "bill" + } + assert response_data == expected_data def test_print_customer_order(): @@ -36,7 +43,14 @@ def test_print_customer_order(): response = client.post("/order_kitchen", json=test_info) assert response.status_code == 200 - assert response.content.decode() == "!Impresion Realizada!" + + response_data = response.json() + expected_data = { + "message": "✅ Pedido de cocina impreso exitosamente!", + "success": True, + "print_type": "kitchen" + } + assert response_data == expected_data def test_print_customer_order_deleted_lines(): @@ -53,7 +67,15 @@ def test_print_customer_order_deleted_lines(): response = client.post("/order_kitchen", json=test_info) assert response.status_code == 200 - assert response.content.decode() == "!Impresion Realizada!" + + response_data = response.json() + expected_data = { + "message": "✅ Pedido de cocina impreso exitosamente!", + "success": True, + "print_type": "kitchen" + } + + assert response_data == expected_data def test_print_bar_order(): @@ -69,4 +91,11 @@ def test_print_bar_order(): response = client.post("/order_bar", json=test_info) assert response.status_code == 200 - assert response.content.decode() == "!Impresion Realizada!" + + response_data = response.json() + expected_data = { + "message": "✅ Pedido de barra impreso exitosamente!", + "success": True, + "print_type": "bar" + } + assert response_data == expected_data