65 lines
2.2 KiB
Python
65 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.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
|