batch import csv
This commit is contained in:
parent
a679775f57
commit
dd0ceef665
20 changed files with 1614 additions and 190 deletions
|
|
@ -6,7 +6,7 @@ from sqlalchemy import func, select
|
|||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.models import Account, MailAlias, MailGroup
|
||||
from app.schemas import MailAliasCreate, MailAliasRead
|
||||
from app.schemas import MailAliasCreate, MailAliasRead, MailGroupEmailCheck
|
||||
|
||||
|
||||
def _alias_read(alias: MailAlias) -> MailAliasRead:
|
||||
|
|
@ -39,6 +39,55 @@ async def list_mail_aliases(
|
|||
return items, counts
|
||||
|
||||
|
||||
async def check_alias_email_available(
|
||||
session: AsyncSession,
|
||||
company_domain: str,
|
||||
email: str,
|
||||
) -> MailGroupEmailCheck:
|
||||
normalized = str(email).lower()
|
||||
if not normalized.endswith(f"@{company_domain}"):
|
||||
return MailGroupEmailCheck(
|
||||
email=normalized,
|
||||
available=False,
|
||||
conflict_type="invalid_domain",
|
||||
)
|
||||
|
||||
account = await session.scalar(
|
||||
select(Account).where(func.lower(Account.email) == normalized)
|
||||
)
|
||||
if account:
|
||||
return MailGroupEmailCheck(
|
||||
email=normalized,
|
||||
available=False,
|
||||
conflict_type="user",
|
||||
)
|
||||
|
||||
group = await session.scalar(
|
||||
select(MailGroup).where(func.lower(MailGroup.email) == normalized)
|
||||
)
|
||||
if group:
|
||||
return MailGroupEmailCheck(
|
||||
email=normalized,
|
||||
available=False,
|
||||
conflict_type="group",
|
||||
)
|
||||
|
||||
alias = await session.scalar(
|
||||
select(MailAlias).where(
|
||||
MailAlias.company_domain == company_domain,
|
||||
func.lower(MailAlias.alias_address) == normalized,
|
||||
)
|
||||
)
|
||||
if alias:
|
||||
return MailGroupEmailCheck(
|
||||
email=normalized,
|
||||
available=False,
|
||||
conflict_type="alias",
|
||||
)
|
||||
|
||||
return MailGroupEmailCheck(email=normalized, available=True)
|
||||
|
||||
|
||||
async def _destination_exists(
|
||||
session: AsyncSession,
|
||||
company_domain: str,
|
||||
|
|
@ -80,26 +129,14 @@ async def create_mail_alias(
|
|||
if alias_address == forwards_to:
|
||||
raise ValueError("Alias cannot forward to itself.")
|
||||
|
||||
existing = await session.scalar(
|
||||
select(MailAlias).where(
|
||||
func.lower(MailAlias.alias_address) == alias_address
|
||||
)
|
||||
availability = await check_alias_email_available(
|
||||
session,
|
||||
company_domain,
|
||||
alias_address,
|
||||
)
|
||||
if existing:
|
||||
if not availability.available:
|
||||
raise ValueError("That alias address is already in use.")
|
||||
|
||||
account_conflict = await session.scalar(
|
||||
select(Account).where(func.lower(Account.email) == alias_address)
|
||||
)
|
||||
if account_conflict:
|
||||
raise ValueError("That address is already a user mailbox.")
|
||||
|
||||
group_conflict = await session.scalar(
|
||||
select(MailGroup).where(func.lower(MailGroup.email) == alias_address)
|
||||
)
|
||||
if group_conflict:
|
||||
raise ValueError("That address is already a group mailbox.")
|
||||
|
||||
if not await _destination_exists(session, company_domain, forwards_to):
|
||||
raise ValueError("Forwarding address must be an existing user or group.")
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue