batch import csv
This commit is contained in:
parent
a679775f57
commit
dd0ceef665
20 changed files with 1614 additions and 190 deletions
|
|
@ -6,8 +6,8 @@ from sqlalchemy import func, select
|
|||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
from app.models import Account, MailGroup, MailGroupMember
|
||||
from app.schemas import MailGroupCreate, MailGroupRead
|
||||
from app.models import Account, MailAlias, MailGroup, MailGroupMember
|
||||
from app.schemas import MailGroupCreate, MailGroupEmailCheck, MailGroupRead
|
||||
|
||||
|
||||
def _group_read(group: MailGroup) -> MailGroupRead:
|
||||
|
|
@ -16,11 +16,62 @@ def _group_read(group: MailGroup) -> MailGroupRead:
|
|||
name=group.name,
|
||||
email=group.email,
|
||||
group_type=group.group_type,
|
||||
owner_id=group.owner_id,
|
||||
send_permission=group.send_permission,
|
||||
member_count=len(group.members),
|
||||
created_at=group.created_at,
|
||||
)
|
||||
|
||||
|
||||
async def check_group_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 list_mail_groups(
|
||||
session: AsyncSession,
|
||||
company_domain: str,
|
||||
|
|
@ -81,6 +132,20 @@ async def create_mail_group(
|
|||
if existing:
|
||||
raise ValueError("That group email address is already in use.")
|
||||
|
||||
owner = await session.scalar(
|
||||
select(Account).where(
|
||||
Account.id == payload.owner_id,
|
||||
Account.company_domain == company_domain,
|
||||
Account.member_status != "suspended",
|
||||
)
|
||||
)
|
||||
if owner is None:
|
||||
raise ValueError("Group owner must be an active member of your organization.")
|
||||
|
||||
availability = await check_group_email_available(session, company_domain, email)
|
||||
if not availability.available:
|
||||
raise ValueError("That group email address is already in use.")
|
||||
|
||||
members = await _validate_member_ids(
|
||||
session,
|
||||
company_domain,
|
||||
|
|
@ -92,6 +157,9 @@ async def create_mail_group(
|
|||
name=payload.name.strip(),
|
||||
email=email,
|
||||
group_type=payload.group_type,
|
||||
owner_id=owner.id,
|
||||
send_permission=payload.send_permission,
|
||||
description=payload.description.strip() if payload.description else None,
|
||||
created_by_id=manager.id,
|
||||
)
|
||||
session.add(group)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue