from fastapi import APIRouter, Depends, HTTPException from hub.auth import get_current_user from hub.firm import Firm, FirmRead, FirmCreate, FirmUpdate router = APIRouter() @router.get("/", response_model=list[FirmRead], response_description="List of firms owned by the current user") async def read_list(user=Depends(get_current_user)) -> list[FirmRead]: return await Firm.find({ "owner": user.id}).to_list() @router.post("/", response_description="Firm added to the database") async def create(item: FirmCreate, user=Depends(get_current_user)) -> FirmRead: exists = await Firm.get_by_name(item.instance, item.firm) 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({"instance": item.instance, "firm": item.firm}) await user.save() return FirmRead(**o.model_dump()) @router.get("/{instance}/{firm}", response_description="Firm retrieved") async def read_id(instance: str, firm: str, user=Depends(get_current_user)) -> FirmRead: item = await Firm.get_by_name(instance, firm) if not item or not user.belong_to(item) not in user.firms: raise HTTPException(status_code=404, detail="Item not found") return FirmRead(**item.model_dump()) @router.put("/{instance}/{firm}", response_description="Firm updated") async def update(instance: str, firm: str, req: FirmUpdate, user=Depends(get_current_user)) -> FirmRead: item = await Firm.get_by_name(instance, firm) if not item or not user.belong_to(item) not in user.firms: raise HTTPException(status_code=404, detail="Item not found") if item.owner != user.id: raise HTTPException( status_code=403, detail="Insufficient credentials to modify Firm" ) 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("/{instance}/{firm}", response_description="Firm deleted from the database") async def delete(instance: str, firm: str, user=Depends(get_current_user)) -> dict: item = await Firm.get_by_name(instance, firm) if not item or not user.belong_to(item) not in user.firms: raise HTTPException(status_code=404, detail="Firm not found") if item.owner != user.id: raise HTTPException( status_code=403, detail="Insufficient credentials delete Firm" ) await item.delete() return { "message": "Firm deleted successfully" }