Files
oc-api_print/Api/main.py

119 lines
3.7 KiB
Python

import json
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",
version="0.0.1"
)
class PrintRequest(BaseModel):
content: str
ip_printer: str
user_name: str
class PrintResponse(BaseModel):
message: str
success: bool
print_type: str
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)
logger.info(
f"Print request from {info.user_name} to {info.ip_printer}")
return data, info.ip_printer, info.user_name
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("/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)
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")
@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"}