85 lines
2.6 KiB
Python
85 lines
2.6 KiB
Python
from uuid import UUID
|
|
|
|
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.deps.domain_owner import require_domain_owner
|
|
from app.models import Account
|
|
from app.routers.auth import validate_password
|
|
from app.schemas import (
|
|
OrgMemberCreate,
|
|
OrgMemberListResponse,
|
|
OrgMemberRead,
|
|
OrgMemberRoleUpdate,
|
|
)
|
|
from app.services.org_members import (
|
|
create_org_member,
|
|
list_org_members,
|
|
update_org_member_role,
|
|
)
|
|
from app.deps.org_manager import require_org_manager
|
|
|
|
router = APIRouter(prefix="/people", tags=["people"])
|
|
|
|
|
|
@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:
|
|
validate_password(payload.password)
|
|
|
|
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
|
|
|
|
|
|
@router.patch("/{member_id}/role", response_model=OrgMemberRead)
|
|
async def update_member_role(
|
|
member_id: UUID,
|
|
payload: OrgMemberRoleUpdate,
|
|
owner: Account = Depends(require_domain_owner),
|
|
session: AsyncSession = Depends(get_postgres_session),
|
|
) -> OrgMemberRead:
|
|
try:
|
|
member = await update_org_member_role(
|
|
session,
|
|
manager=owner,
|
|
member_id=member_id,
|
|
org_role=payload.org_role,
|
|
)
|
|
await session.commit()
|
|
return member
|
|
except ValueError as error:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
|
detail=str(error),
|
|
) from error
|