from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_postgres_session from app.models import Account from app.routers.auth import get_current_account, validate_password from app.schemas import OrgMemberCreate, OrgMemberListResponse, OrgMemberRead from app.services.org_members import ( can_manage_org_members, create_org_member, list_org_members, ) router = APIRouter(prefix="/people", tags=["people"]) async def require_org_manager( account: Account = Depends(get_current_account), session: AsyncSession = Depends(get_postgres_session), ) -> Account: if not await can_manage_org_members(session, account): raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="Only company admins can manage people.", ) return account @router.get("", response_model=OrgMemberListResponse) async def get_people( manager: Account = Depends(require_org_manager), session: AsyncSession = Depends(get_postgres_session), ) -> OrgMemberListResponse: items, counts = await list_org_members(session, manager.company_domain) return OrgMemberListResponse(items=items, counts=counts) @router.post("", response_model=OrgMemberRead, status_code=status.HTTP_201_CREATED) async def add_person( payload: OrgMemberCreate, manager: Account = Depends(require_org_manager), session: AsyncSession = Depends(get_postgres_session), ) -> OrgMemberRead: if not payload.send_invitation: validate_password(payload.password or "") try: member = await create_org_member( session, manager=manager, payload=payload, ) await session.commit() return member except ValueError as error: raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=str(error), ) from error except IntegrityError as error: await session.rollback() raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="An account with those details already exists.", ) from error