You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
6.0 KiB
Python
144 lines
6.0 KiB
Python
from dataclasses import dataclass
|
|
|
|
from fastapi import Query
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
from app.common.enums import QueueEnum
|
|
from app.core.base_params import BaseQueryParam, UserByQueryParam
|
|
from app.core.base_schema import BaseSchema, UserBySchema
|
|
from app.core.validator import DateTimeStr
|
|
|
|
|
|
class EmailConfigCreateSchema(BaseModel):
|
|
"""创建 SMTP 配置"""
|
|
|
|
name: str | None = Field(default=None, max_length=100, description="配置名称")
|
|
smtp_host: str | None = Field(default=None, max_length=255, description="SMTP 服务器地址")
|
|
smtp_port: int | None = Field(default=None, ge=1, le=65535, description="SMTP 端口")
|
|
smtp_user: str | None = Field(default=None, max_length=255, description="SMTP 登录用户名")
|
|
smtp_password: str | None = Field(default=None, max_length=255, description="SMTP 授权密码")
|
|
from_name: str | None = Field(default=None, max_length=100, description="发件人显示名")
|
|
use_tls: bool | None = Field(default=None, description="是否启用 SSL/TLS")
|
|
is_default: bool | None = Field(default=None, description="是否设为默认配置")
|
|
timeout: int | None = Field(default=None, ge=5, le=120, description="连接超时(秒)")
|
|
status: int = Field(default=0, ge=0, le=1, description="状态(0:启动 1:停用)")
|
|
description: str | None = Field(default=None, max_length=255, description="备注")
|
|
|
|
|
|
class EmailConfigUpdateSchema(EmailConfigCreateSchema):
|
|
"""更新 SMTP 配置"""
|
|
|
|
|
|
class EmailConfigOutSchema(EmailConfigCreateSchema, BaseSchema):
|
|
"""SMTP 配置响应(不含密码)"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
@dataclass
|
|
class EmailConfigQueryParam(BaseQueryParam):
|
|
"""SMTP 配置查询参数"""
|
|
|
|
name: str | None = Query(None, description="配置名称")
|
|
status: int | None = Query(None, description="状态")
|
|
is_default: bool | None = Query(None, description="是否默认配置")
|
|
|
|
def __post_init__(self) -> None:
|
|
if self.name:
|
|
self.name = (QueueEnum.like.value, self.name)
|
|
if self.status is not None:
|
|
self.status = (QueueEnum.eq.value, self.status)
|
|
if self.is_default is not None:
|
|
self.is_default = (QueueEnum.eq.value, self.is_default)
|
|
|
|
|
|
class EmailTemplateCreateSchema(BaseModel):
|
|
"""创建邮件模板"""
|
|
|
|
name: str | None = Field(default=None, max_length=100, description="模板名称")
|
|
template_code: str | None = Field(default=None, max_length=100, description="模板编码")
|
|
subject: str | None = Field(default=None, max_length=255, description="邮件主题")
|
|
body_html: str | None = Field(default=None, description="邮件正文 HTML")
|
|
body_text: str | None = Field(default=None, description="纯文本版本")
|
|
variables: str | None = Field(default=None, description="变量说明 JSON")
|
|
status: int = Field(default=0, ge=0, le=1, description="状态(0:启动 1:停用)")
|
|
description: str | None = Field(default=None, max_length=255, description="备注")
|
|
|
|
|
|
class EmailTemplateUpdateSchema(EmailTemplateCreateSchema):
|
|
"""更新邮件模板"""
|
|
|
|
|
|
class EmailTemplateOutSchema(EmailTemplateCreateSchema, BaseSchema):
|
|
"""邮件模板响应"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
@dataclass
|
|
class EmailTemplateQueryParam(BaseQueryParam):
|
|
"""邮件模板查询参数"""
|
|
|
|
name: str | None = Query(None, description="模板名称")
|
|
template_code: str | None = Query(None, description="模板编码")
|
|
|
|
def __post_init__(self) -> None:
|
|
if self.name:
|
|
self.name = (QueueEnum.like.value, self.name)
|
|
if self.template_code:
|
|
self.template_code = (QueueEnum.like.value, self.template_code)
|
|
|
|
|
|
class EmailSendSchema(BaseModel):
|
|
"""手动发送邮件(测试用)"""
|
|
|
|
to_email: str = Field(..., min_length=5, max_length=255, description="收件人邮箱")
|
|
to_name: str | None = Field(default=None, max_length=100, description="收件人姓名")
|
|
template_code: str = Field(..., min_length=1, max_length=100, description="模板编码")
|
|
variables: dict = Field(default_factory=dict, description="模板变量 {key: value}")
|
|
config_id: int | None = Field(default=None, gt=0, description="指定 SMTP 配置 ID")
|
|
biz_type: str = Field(default="other", max_length=50, description="业务类型")
|
|
|
|
|
|
class EmailLogOutSchema(BaseSchema, UserBySchema):
|
|
"""邮件日志响应"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
config_id: int | None = Field(default=None, description="SMTP 配置 ID")
|
|
template_code: str | None = Field(default=None, description="模板编码")
|
|
to_email: str = Field(..., description="收件人邮箱")
|
|
to_name: str | None = Field(default=None, description="收件人姓名")
|
|
subject: str = Field(..., description="邮件主题")
|
|
biz_type: str = Field(..., description="业务类型")
|
|
error_msg: str | None = Field(default=None, description="错误信息")
|
|
retry_count: int = Field(..., description="重试次数")
|
|
sent_time: DateTimeStr | None = Field(default=None, description="发送时间")
|
|
|
|
|
|
@dataclass
|
|
class EmailLogQueryParam(BaseQueryParam, UserByQueryParam):
|
|
"""邮件日志查询参数"""
|
|
|
|
to_email: str | None = Query(None, description="收件人邮箱")
|
|
biz_type: str | None = Query(None, description="业务类型")
|
|
status: int | None = Query(None, description="状态")
|
|
template_code: str | None = Query(None, description="模板编码")
|
|
|
|
def __post_init__(self) -> None:
|
|
if self.to_email:
|
|
self.to_email = (QueueEnum.like.value, self.to_email)
|
|
if self.biz_type:
|
|
self.biz_type = (QueueEnum.eq.value, self.biz_type)
|
|
if self.status is not None:
|
|
self.status = (QueueEnum.eq.value, self.status)
|
|
if self.template_code:
|
|
self.template_code = (QueueEnum.eq.value, self.template_code)
|
|
|
|
|
|
class EmailTestSchema(BaseModel):
|
|
"""测试 SMTP 连接"""
|
|
|
|
config_id: int = Field(..., gt=0, description="SMTP 配置 ID")
|
|
to_email: str = Field(..., min_length=5, max_length=255, description="测试收件人")
|