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.org_manager import require_org_manager from app.models import Account from app.schemas import MailGroupCreate, MailGroupListResponse, MailGroupRead from app.services.mail_groups import create_mail_group, list_mail_groups router = APIRouter(prefix="/groups", tags=["groups"]) @router.get("", response_model=MailGroupListResponse) async def get_groups( manager: Account = Depends(require_org_manager), session: AsyncSession = Depends(get_postgres_session), ) -> MailGroupListResponse: items, counts = await list_mail_groups(session, manager.company_domain) return MailGroupListResponse(items=items, counts=counts) @router.post("", response_model=MailGroupRead, status_code=status.HTTP_201_CREATED) async def add_group( payload: MailGroupCreate, manager: Account = Depends(require_org_manager), session: AsyncSession = Depends(get_postgres_session), ) -> MailGroupRead: try: group = await create_mail_group(session, manager=manager, payload=payload) await session.commit() return group 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="That group could not be created.", ) from error