import uuid from typing import List, Optional import brewman.schemas.master as schemas from fastapi import APIRouter, Depends, HTTPException, Security, status from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import CostCentre from ..schemas.auth import UserToken router = APIRouter() # Dependency def get_db(): try: db = SessionLocal() yield db finally: db.close() @router.post("", response_model=schemas.CostCentre) def save( data: schemas.CostCentreIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cost-centres"]), ): try: item = CostCentre(name=data.name) db.add(item) db.commit() return cost_centre_info(item) except SQLAlchemyError as e: db.rollback() raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), ) except Exception: db.rollback() raise @router.put("/{id_}", response_model=schemas.CostCentre) def update( id_: uuid.UUID, data: schemas.CostCentreIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cost-centres"]), ): try: item = db.query(CostCentre).filter(CostCentre.id == id_).first() if item.is_fixture: raise HTTPException( status_code=status.HTTP_423_LOCKED, detail=f"{item.name} is a fixture and cannot be edited or deleted.", ) item.name = data.name db.commit() return cost_centre_info(item) except SQLAlchemyError as e: db.rollback() raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), ) except Exception: db.rollback() raise @router.delete("/{id_}") def delete( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cost-centres"]), ): try: item: CostCentre = db.query(CostCentre).filter(CostCentre.id == id_).first() if item is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Cost Centre not found", ) elif item.is_fixture: raise HTTPException( status_code=status.HTTP_423_LOCKED, detail=f"{item.name} is a fixture and cannot be edited or deleted.", ) else: raise HTTPException( status_code=status.HTTP_501_NOT_IMPLEMENTED, detail="Cost Centre deletion not implemented", ) except Exception: db.rollback() raise @router.get("") def show_blank( db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cost-centres"]), ): return cost_centre_info(None) @router.get("/list", response_model=List[schemas.CostCentre]) async def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): return [ {"id": item.id, "name": item.name, "isFixture": item.is_fixture} for item in db.query(CostCentre).order_by(CostCentre.name).all() ] @router.get("/{id_}", response_model=schemas.CostCentre) def show_id( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cost-centres"]), ): item = db.query(CostCentre).filter(CostCentre.id == id_).first() return cost_centre_info(item) def cost_centre_info(item: Optional[CostCentre]): if item is None: return { "name": "", "isFixture": False, } else: return { "id": item.id, "name": item.name, "isFixture": item.is_fixture, }