from beanie import PydanticObjectId from fastapi import APIRouter, Depends, HTTPException from hub.auth import get_current_user from hub.firm import Firm, FirmRead, FirmCreate, FirmUpdate router = APIRouter() @router.post("/", response_description="{} added to the database".format(Firm.__name__)) async def create(item: FirmCreate, user=Depends(get_current_user)) -> FirmRead: firm_dict = {"name": item.name, "instance": item.instance} exists = await Firm.find_one(firm_dict) if exists: raise HTTPException(status_code=400, detail="Firm already exists") record = Firm(created_by=user.id, updated_by=user.id, owner=user.id, **item.model_dump()) o = await record.create() user.firms.append(firm_dict) await user.save() return FirmRead(**o.model_dump()) @router.get("/{id}", response_description="{} record retrieved".format(Firm.__name__)) async def read_id(id: PydanticObjectId, user=Depends(get_current_user)) -> FirmRead: item = await Firm.get(id) return FirmRead(**item.model_dump()) @router.put("/{id}", response_description="{} record updated".format(Firm.__name__)) async def update(id: PydanticObjectId, req: FirmUpdate, user=Depends(get_current_user)) -> FirmRead: item = await Firm.get(id) if not item: raise HTTPException( status_code=404, detail="{} record not found!".format(Firm.__name__) ) if item.owner != user.id: raise HTTPException( status_code=403, detail="Insufficient credentials to modify {} record".format(Firm.__name__) ) req = {k: v for k, v in req.model_dump().items() if v is not None} update_query = {"$set": { field: value for field, value in req.items() }} await item.update(update_query) return FirmRead(**item.dict()) @router.delete("/{id}", response_description="{} record deleted from the database".format(Firm.__name__)) async def delete(id: PydanticObjectId, user=Depends(get_current_user)) -> dict: item = await Firm.get(id) if not item: raise HTTPException( status_code=404, detail="{} record not found!".format(Firm.__name__) ) if item.owner != user.id: raise HTTPException( status_code=403, detail="Insufficient credentials delete {} record".format(Firm.__name__) ) await item.delete() return { "message": "{} deleted successfully".format(Firm.__name__) }