agentic.email/backend/app/routers/people.py
2026-10-04 20:01:29 +05:30

66 lines
2.2 KiB
Python

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