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, MailGroupEmailCheck, MailGroupListResponse, MailGroupRead from app.services.mail_groups import ( check_group_email_available, 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.get("/check-email", response_model=MailGroupEmailCheck) async def check_email( email: str, manager: Account = Depends(require_org_manager), session: AsyncSession = Depends(get_postgres_session), ) -> MailGroupEmailCheck: if manager.company_domain is None: raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail="Company domain is required.", ) result = await check_group_email_available( session, manager.company_domain, email, ) return result @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