from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import List from database import get_db from models.table import Table from models.order import Order from models.user import User from schemas.table import TableCreate, TableUpdate, TableFloorplanUpdate, TableOut from routers.deps import get_current_user, require_manager router = APIRouter() @router.get("/", response_model=List[TableOut]) def list_tables(db: Session = Depends(get_db), user: User = Depends(get_current_user)): return db.query(Table).filter(Table.is_active == True).all() @router.post("/", response_model=TableOut, status_code=status.HTTP_201_CREATED) def create_table(body: TableCreate, db: Session = Depends(get_db), user: User = Depends(require_manager)): if db.query(Table).filter(Table.number == body.number).first(): raise HTTPException(status_code=400, detail="Table number already exists") table = Table(**body.model_dump()) db.add(table) db.commit() db.refresh(table) return table @router.put("/{table_id}", response_model=TableOut) def update_table(table_id: int, body: TableUpdate, db: Session = Depends(get_db), user: User = Depends(require_manager)): table = db.query(Table).filter(Table.id == table_id).first() if not table: raise HTTPException(status_code=404, detail="Table not found") for field, value in body.model_dump(exclude_none=True).items(): setattr(table, field, value) db.commit() db.refresh(table) return table @router.delete("/{table_id}", status_code=status.HTTP_204_NO_CONTENT) def deactivate_table(table_id: int, db: Session = Depends(get_db), user: User = Depends(require_manager)): table = db.query(Table).filter(Table.id == table_id).first() if not table: raise HTTPException(status_code=404, detail="Table not found") table.is_active = False db.commit() @router.get("/{table_id}/status") def table_status(table_id: int, db: Session = Depends(get_db), user: User = Depends(get_current_user)): table = db.query(Table).filter(Table.id == table_id).first() if not table: raise HTTPException(status_code=404, detail="Table not found") active_order = ( db.query(Order) .filter(Order.table_id == table_id, Order.status.in_(["open", "partially_paid"])) .first() ) return { "table": TableOut.model_validate(table), "active_order_id": active_order.id if active_order else None, "order_status": active_order.status if active_order else None, } @router.put("/{table_id}/floorplan", response_model=TableOut) def update_floorplan(table_id: int, body: TableFloorplanUpdate, db: Session = Depends(get_db), user: User = Depends(require_manager)): table = db.query(Table).filter(Table.id == table_id).first() if not table: raise HTTPException(status_code=404, detail="Table not found") table.floor_x = body.floor_x table.floor_y = body.floor_y db.commit() db.refresh(table) return table