from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from typing import Optional import uuid from bd import Settings from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from bd.tables.organization import Organization from bd.tables.group import Group from route.auth_utils import get_current_user router = APIRouter(tags=["organizations"], prefix="/organizations") class OrganizationCreate(BaseModel): name_organization: str group_id: str class OrganizationUpdate(BaseModel): name_organization: Optional[str] group_id: Optional[str] def get_session(): settings = Settings() engine = create_engine(settings.DATABASE_URL_syncpg, future=True) return sessionmaker(bind=engine, future=True) @router.post("/", status_code=201) def create_organization(payload: OrganizationCreate, _: object = Depends(get_current_user)): Session = get_session() try: gid = uuid.UUID(payload.group_id) except Exception: raise HTTPException(status_code=400, detail="Invalid group_id UUID") with Session() as session: grp = session.get(Group, gid) if not grp: raise HTTPException(status_code=404, detail="Group not found") org = Organization(name_organization=payload.name_organization, group_id=gid) session.add(org) session.commit() session.refresh(org) return {"id": str(org.id), "name_organization": org.name_organization, "group_id": str(org.group_id)} @router.get("/") def list_organizations(): Session = get_session() with Session() as session: rows = session.query(Organization).all() return [{"id": str(o.id), "name_organization": o.name_organization, "group_id": str(o.group_id)} for o in rows] @router.get("/{org_id}") def get_organization(org_id: str): Session = get_session() try: oid = uuid.UUID(org_id) except Exception: raise HTTPException(status_code=400, detail="Invalid UUID") with Session() as session: org = session.get(Organization, oid) if not org: raise HTTPException(status_code=404, detail="Organization not found") return {"id": str(org.id), "name_organization": org.name_organization, "group_id": str(org.group_id)} @router.put("/{org_id}") def update_organization(org_id: str, payload: OrganizationUpdate, _: object = Depends(get_current_user)): Session = get_session() try: oid = uuid.UUID(org_id) except Exception: raise HTTPException(status_code=400, detail="Invalid UUID") with Session() as session: org = session.get(Organization, oid) if not org: raise HTTPException(status_code=404, detail="Organization not found") if payload.name_organization is not None: org.name_organization = payload.name_organization if payload.group_id is not None: try: new_gid = uuid.UUID(payload.group_id) except Exception: raise HTTPException(status_code=400, detail="Invalid group_id UUID") grp = session.get(Group, new_gid) if not grp: raise HTTPException(status_code=404, detail="Group not found") org.group_id = new_gid session.add(org) session.commit() session.refresh(org) return {"id": str(org.id), "name_organization": org.name_organization, "group_id": str(org.group_id)} @router.delete("/{org_id}", status_code=204) def delete_organization(org_id: str, _: object = Depends(get_current_user)): Session = get_session() try: oid = uuid.UUID(org_id) except Exception: raise HTTPException(status_code=400, detail="Invalid UUID") with Session() as session: org = session.get(Organization, oid) if not org: raise HTTPException(status_code=404, detail="Organization not found") session.delete(org) session.commit() return {}