122 lines
3.8 KiB
Python
122 lines
3.8 KiB
Python
import json
|
|
import logging
|
|
from typing import Dict, Any, Tuple
|
|
from fastapi import FastAPI, HTTPException
|
|
from pydantic import BaseModel
|
|
from formats import BillPrinter, CustomerOrderPrinter
|
|
|
|
# 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)
|
|
printer = BillPrinter(address)
|
|
printer.print_bill(data, 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)
|
|
printer = CustomerOrderPrinter(address)
|
|
printer.print_order(data, 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)
|
|
printer = CustomerOrderPrinter(address)
|
|
printer.print_order(data, 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"}
|