from fastapi import APIRouter, 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.group import Group from bd.tables.users import User router = APIRouter(tags=["groups"], prefix="/groups") class GroupCreate(BaseModel): name_group: str user_id: str class GroupUpdate(BaseModel): name_group: Optional[str] user_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_group(payload: GroupCreate): Session = get_session() try: uid = uuid.UUID(payload.user_id) except Exception: raise HTTPException(status_code=400, detail="Invalid user_id UUID") with Session() as session: user = session.get(User, uid) if not user: raise HTTPException(status_code=404, detail="User not found") grp = Group(name_group=payload.name_group, user_id=uid) session.add(grp) session.commit() session.refresh(grp) return {"id": str(grp.id), "name_group": grp.name_group, "user_id": str(grp.user_id)} @router.get("/") def list_groups(): Session = get_session() with Session() as session: rows = session.query(Group).all() return [{"id": str(g.id), "name_group": g.name_group, "user_id": str(g.user_id)} for g in rows] @router.get("/{group_id}") def get_group(group_id: str): Session = get_session() try: gid = uuid.UUID(group_id) except Exception: raise HTTPException(status_code=400, detail="Invalid UUID") with Session() as session: grp = session.get(Group, gid) if not grp: raise HTTPException(status_code=404, detail="Group not found") return {"id": str(grp.id), "name_group": grp.name_group, "user_id": str(grp.user_id)} @router.put("/{group_id}") def update_group(group_id: str, payload: GroupUpdate): Session = get_session() try: gid = uuid.UUID(group_id) except Exception: raise HTTPException(status_code=400, detail="Invalid UUID") with Session() as session: grp = session.get(Group, gid) if not grp: raise HTTPException(status_code=404, detail="Group not found") if payload.name_group is not None: grp.name_group = payload.name_group if payload.user_id is not None: try: new_uid = uuid.UUID(payload.user_id) except Exception: raise HTTPException(status_code=400, detail="Invalid user_id UUID") user = session.get(User, new_uid) if not user: raise HTTPException(status_code=404, detail="User not found") grp.user_id = new_uid session.add(grp) session.commit() session.refresh(grp) return {"id": str(grp.id), "name_group": grp.name_group, "user_id": str(grp.user_id)} @router.delete("/{group_id}", status_code=204) def delete_group(group_id: str): Session = get_session() try: gid = uuid.UUID(group_id) except Exception: raise HTTPException(status_code=400, detail="Invalid UUID") with Session() as session: grp = session.get(Group, gid) if not grp: raise HTTPException(status_code=404, detail="Group not found") session.delete(grp) session.commit() return {}