from typing import List, Optional from backend.models.models import EmailSenderDoc from common.log.module_logger import ModuleLogger class EmailSenderHandler: def __init__(self): self.module_logger = ModuleLogger(sender_id="EmailSenderHandler") async def get_email_sender(self, tenant_id: str) -> str: """get email sender for tenant""" try: doc = await EmailSenderDoc.find_one({"tenant_id": tenant_id, "is_active": True}) return doc.email_sender if doc else None except Exception as e: await self.module_logger.log_error( error="Failed to get email sender", properties={"tenant_id": tenant_id, "error": str(e)} ) return None async def set_email_sender(self, tenant_id: str, email_sender: str): """set email sender for tenant""" try: doc = await EmailSenderDoc.find_one({"tenant_id": tenant_id}) if doc: await doc.set({"email_sender": email_sender}) await self.module_logger.log_info( info="Email senders set in database", properties={ "tenant_id": tenant_id, "email_sender": email_sender } ) return {"success": True, "email_sender": email_sender} else: doc = EmailSenderDoc(tenant_id=tenant_id, email_sender=email_sender) await doc.create() await self.module_logger.log_info( info="Email sender doc created", properties={ "tenant_id": tenant_id, "email_sender": email_sender } ) return {"success": True, "email_sender": doc.email_sender} except Exception as e: await self.module_logger.log_error( error="Failed to set email sender", properties={ "tenant_id": tenant_id, "error": str(e) } ) raise async def update_email_sender(self, tenant_id: str, email_sender: str): """update email sender for tenant (only if exists)""" try: doc = await EmailSenderDoc.find_one({"tenant_id": tenant_id, "is_active": True}) if not doc: raise ValueError("Email sender configuration not found") await doc.set({"email_sender": email_sender}) await self.module_logger.log_info( info="Email sender updated in database", properties={ "tenant_id": tenant_id, "email_sender": email_sender } ) return {"success": True, "email_sender": email_sender} except Exception as e: await self.module_logger.log_error( error="Failed to update email sender", properties={ "tenant_id": tenant_id, "error": str(e) } ) raise async def remove_email_sender(self, tenant_id: str): """remove email sender from tenant""" try: doc = await EmailSenderDoc.find_one({"tenant_id": tenant_id, "is_active": True}) if not doc or not doc.email_sender: return {"success": False, "msg": "No sender found"} original_email_sender = doc.email_sender await doc.set({"email_sender": None}) await self.module_logger.log_info( info="Email sender removed from database", properties={ "tenant_id": tenant_id, "removed_email_sender": original_email_sender } ) return {"success": True, "removed_email_sender": original_email_sender} except Exception as e: await self.module_logger.log_error( error="Failed to remove email sender", properties={ "tenant_id": tenant_id, "error": str(e) } ) raise async def delete_email_sender(self, tenant_id: str): """delete email sender for tenant""" try: doc = await EmailSenderDoc.find_one({"tenant_id": tenant_id}) if doc: await doc.delete() await self.module_logger.log_info( info="Email sender configuration deleted from database", properties={"tenant_id": tenant_id} ) return {"success": True} return {"success": False, "msg": "No sender config found"} except Exception as e: await self.module_logger.log_error( error="Failed to delete email sender", properties={ "tenant_id": tenant_id, "error": str(e) } ) raise