feat(models): add indexs and models

add high-frequent indexes for TemplateMessageDoc and EmailSenderDoc
add some models that will be used in sending email
This commit is contained in:
YuehuCao 2025-08-07 12:44:37 +08:00
parent e46c81c993
commit c1148a44d5

View File

@ -1,8 +1,9 @@
from beanie import Document from beanie import Document
from datetime import datetime from datetime import datetime
from typing import Optional from typing import Optional, List
from common.constants.region import UserRegion from common.constants.region import UserRegion
from common.constants.email import EmailSenderStatus, BounceType
class MessageTemplateDoc(Document): class MessageTemplateDoc(Document):
template_id: str template_id: str
@ -16,11 +17,91 @@ class MessageTemplateDoc(Document):
class Settings: class Settings:
name = "message_templates_doc" name = "message_templates_doc"
indexes = [
"template_id",
"tenant_id",
"region"
]
class EmailSenderDoc(Document): class EmailSenderDoc(Document):
tenant_id: str tenant_id: str
email_senders: list[str] = [] email_senders: List[str] = []
is_active: bool = True is_active: bool = True
class Settings: class Settings:
name = "email_sender_doc" name = "email_sender_doc"
indexes = ["tenant_id"]
class EmailSenderStatusDoc(Document):
email_id: str
tenant_id: str
email_senders: List[str]
recipient_email: str
template_id: Optional[str] = None
subject: str
body: str
status: EmailSenderStatus = EmailSenderStatus.PENDING
sent_at: Optional[datetime] = None
failed_at: Optional[datetime] = None
error_message: Optional[str] = None
retry_count: int = 0
max_retries: int = 3
message_id: Optional[str] = None
created_at: datetime = datetime.utcnow()
updated_at: Optional[datetime] = None
class Settings:
name = "email_sender_status_doc"
indexes = [
"email_id",
"tenant_id"
]
class EmailTrackingDoc(Document):
email_id: str
tenant_id: str
recipient_email: str
template_id: Optional[str] = None
sent_at: datetime
message_id: Optional[str] = None
opened_at: Optional[datetime] = None
opened_count: int = 0
clicked_at: Optional[datetime] = None
clicked_count: int = 0
clicked_links: List[str] = []
user_agent: Optional[str] = None
ip_address: Optional[str] = None
tracking_enabled: bool = True
created_at: datetime = datetime.utcnow()
updated_at: Optional[datetime] = None
class Settings:
name = "email_tracking_doc"
indexes = [
"email_id",
"tenant_id"
]
class EmailBounceDoc(Document):
email: str
tenant_id: str
template_id: Optional[str] = None
bounce_type: BounceType
reason: str
bounced_at: datetime
original_email_id: Optional[str] = None
original_message_id: Optional[str] = None
processed: bool = False
processed_at: Optional[datetime] = None
created_at: datetime = datetime.utcnow()
class Settings:
name = "email_bounce_doc"
indexes = [
"email",
"tenant_id"
]