freeleaps-service-hub/apps/notification/backend/business/email_sender_manager.py
YuehuCao 2f10275493 refactor(architecture): implement 5-layer separation
for both template message and email senders, their workflow will follow:
api->application->business->service->infra
2025-08-07 12:58:19 +08:00

127 lines
4.2 KiB
Python

from typing import List
from backend.services.email_sender_service import EmailSenderService
from backend.models.models import EmailSenderDoc
from common.log.module_logger import ModuleLogger
from datetime import datetime, timezone
class EmailSenderManager:
def __init__(self):
self.email_sender_service = EmailSenderService()
self.module_logger = ModuleLogger(sender_id="EmailSenderManager")
async def get_email_senders(self, tenant_id: str):
"""get email senders for tenant"""
email_senders = await self.email_sender_service.get_email_senders(tenant_id)
await self.module_logger.log_info(
info="Email senders retrieved",
properties={
"tenant_id": tenant_id,
"sender_count": len(email_senders)
}
)
return email_senders
async def set_email_senders(self, tenant_id: str, email_senders: List[str]):
"""set email senders for tenant"""
if not email_senders:
raise ValueError("Email senders list cannot be empty")
for email in email_senders:
if not self._is_valid_email(email):
raise ValueError(f"Invalid email format: {email}")
result = await self.email_sender_service.set_email_senders(tenant_id, email_senders)
await self.module_logger.log_info(
info="Email senders set",
properties={
"tenant_id": tenant_id,
"sender_count": len(email_senders)
}
)
return result
async def add_email_senders(self, tenant_id: str, new_senders: List[str]):
"""add email senders to tenant"""
if not new_senders:
raise ValueError("New senders list cannot be empty")
for email in new_senders:
if not self._is_valid_email(email):
raise ValueError(f"Invalid email format: {email}")
result = await self.email_sender_service.add_email_senders(tenant_id, new_senders)
await self.module_logger.log_info(
info="Email senders added",
properties={
"tenant_id": tenant_id,
"new_sender_count": len(new_senders),
"success": result.get("success", False)
}
)
return result
async def remove_email_senders(self, tenant_id: str, emails_to_remove: List[str]):
"""remove email senders from tenant"""
if not emails_to_remove:
raise ValueError("Emails to remove list cannot be empty")
result = await self.email_sender_service.remove_email_senders(tenant_id, emails_to_remove)
await self.module_logger.log_info(
info="Email senders removed",
properties={
"tenant_id": tenant_id,
"removed_count": len(emails_to_remove),
"success": result.get("success", False)
}
)
return result
async def clear_email_senders(self, tenant_id: str):
"""clear email senders for tenant"""
result = await self.email_sender_service.clear_email_senders(tenant_id)
await self.module_logger.log_info(
info="Email senders cleared",
properties={
"tenant_id": tenant_id,
"success": result.get("success", False)
}
)
return result
async def delete_email_sender(self, tenant_id: str):
"""delete email sender for tenant"""
result = await self.email_sender_service.delete_email_sender(tenant_id)
await self.module_logger.log_info(
info="Email sender configuration deleted",
properties={
"tenant_id": tenant_id,
"success": result.get("success", False)
}
)
return result
def _is_valid_email(self, email: str) -> bool:
"""validate email format"""
# TODO: add more complex email format validation if needed
import re
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return re.match(pattern, email) is not None