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 MailAliasCreate, MailAliasListResponse, MailAliasRead, MailGroupEmailCheck from app.services.mail_aliases import ( check_alias_email_available, create_mail_alias, list_mail_aliases, ) router = APIRouter(prefix="/aliases", tags=["aliases"]) @router.get("", response_model=MailAliasListResponse) async def get_aliases( manager: Account = Depends(require_org_manager), session: AsyncSession = Depends(get_postgres_session), ) -> MailAliasListResponse: items, counts = await list_mail_aliases(session, manager.company_domain) return MailAliasListResponse(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.", ) return await check_alias_email_available( session, manager.company_domain, email, ) @router.post("", response_model=MailAliasRead, status_code=status.HTTP_201_CREATED) async def add_alias( payload: MailAliasCreate, manager: Account = Depends(require_org_manager), session: AsyncSession = Depends(get_postgres_session), ) -> MailAliasRead: try: alias = await create_mail_alias(session, manager=manager, payload=payload) await session.commit() return alias 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 alias could not be created.", ) from error