refactor: 更新项目引用路径从perfect-panel/ppanel-server到perfect-panel/server
feat: 添加版本和构建时间变量 fix: 修正短信队列类型注释错误 style: 清理未使用的代码和测试文件 docs: 更新安装文档中的下载链接 chore: 迁移数据库脚本添加日志和订阅配置
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
package emailLogic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
|
||||
"github.com/hibiken/asynq"
|
||||
taskModel "github.com/perfect-panel/server/internal/model/task"
|
||||
"github.com/perfect-panel/server/internal/svc"
|
||||
"github.com/perfect-panel/server/pkg/email"
|
||||
"github.com/perfect-panel/server/pkg/logger"
|
||||
)
|
||||
|
||||
type BatchEmailLogic struct {
|
||||
svcCtx *svc.ServiceContext
|
||||
}
|
||||
|
||||
type ErrorInfo struct {
|
||||
Error string `json:"error"`
|
||||
Email string `json:"email"`
|
||||
Time int64 `json:"time"`
|
||||
}
|
||||
|
||||
func NewBatchEmailLogic(svcCtx *svc.ServiceContext) *BatchEmailLogic {
|
||||
return &BatchEmailLogic{
|
||||
svcCtx: svcCtx,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *BatchEmailLogic) ProcessTask(ctx context.Context, task *asynq.Task) error {
|
||||
// 解析任务负载
|
||||
payload := task.Payload()
|
||||
if len(payload) == 0 {
|
||||
logger.Error("[BatchEmailLogic] ProcessTask failed: empty payload")
|
||||
return asynq.SkipRetry
|
||||
}
|
||||
// 转换获取任务id
|
||||
taskID, err := strconv.ParseInt(string(payload), 10, 64)
|
||||
if err != nil {
|
||||
logger.WithContext(ctx).Error("[BatchEmailLogic] ProcessTask failed: invalid task ID",
|
||||
logger.Field("error", err.Error()),
|
||||
logger.Field("payload", string(payload)),
|
||||
)
|
||||
return asynq.SkipRetry
|
||||
}
|
||||
tx := l.svcCtx.DB.WithContext(ctx)
|
||||
var taskInfo taskModel.Task
|
||||
if err = tx.Model(&taskModel.Task{}).Where("id = ?", taskID).First(&taskInfo).Error; err != nil {
|
||||
logger.WithContext(ctx).Error("[BatchEmailLogic] ProcessTask failed",
|
||||
logger.Field("error", err.Error()),
|
||||
logger.Field("taskID", taskID),
|
||||
)
|
||||
return asynq.SkipRetry
|
||||
}
|
||||
|
||||
if taskInfo.Status != 0 {
|
||||
logger.WithContext(ctx).Info("[BatchEmailLogic] ProcessTask skipped: task already processed",
|
||||
logger.Field("taskID", taskID),
|
||||
logger.Field("status", taskInfo.Status),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
|
||||
sender, err := email.NewSender(l.svcCtx.Config.Email.Platform, l.svcCtx.Config.Email.PlatformConfig, l.svcCtx.Config.Site.SiteName)
|
||||
if err != nil {
|
||||
logger.WithContext(ctx).Error("[BatchEmailLogic] NewSender failed", logger.Field("error", err.Error()))
|
||||
return nil
|
||||
}
|
||||
manager := email.NewWorkerManager(l.svcCtx.DB, sender)
|
||||
if manager == nil {
|
||||
logger.WithContext(ctx).Error("[BatchEmailLogic] ProcessTask failed: worker manager is nil")
|
||||
return asynq.SkipRetry
|
||||
}
|
||||
|
||||
// 添加或获取 Worker 实例
|
||||
manager.AddWorker(taskID)
|
||||
return nil
|
||||
}
|
||||
@@ -1,16 +1,19 @@
|
||||
package emailLogic
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/logger"
|
||||
"github.com/perfect-panel/server/pkg/logger"
|
||||
|
||||
"github.com/hibiken/asynq"
|
||||
"github.com/perfect-panel/ppanel-server/internal/model/log"
|
||||
"github.com/perfect-panel/ppanel-server/internal/svc"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/email"
|
||||
"github.com/perfect-panel/ppanel-server/queue/types"
|
||||
"github.com/perfect-panel/server/internal/model/log"
|
||||
"github.com/perfect-panel/server/internal/svc"
|
||||
"github.com/perfect-panel/server/pkg/email"
|
||||
"github.com/perfect-panel/server/queue/types"
|
||||
)
|
||||
|
||||
type SendEmailLogic struct {
|
||||
@@ -31,8 +34,7 @@ func (l *SendEmailLogic) ProcessTask(ctx context.Context, task *asynq.Task) erro
|
||||
)
|
||||
return nil
|
||||
}
|
||||
messageLog := log.MessageLog{
|
||||
Type: log.Email.String(),
|
||||
messageLog := log.Message{
|
||||
Platform: l.svcCtx.Config.Email.Platform,
|
||||
To: payload.Email,
|
||||
Subject: payload.Subject,
|
||||
@@ -43,18 +45,111 @@ func (l *SendEmailLogic) ProcessTask(ctx context.Context, task *asynq.Task) erro
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] NewSender failed", logger.Field("error", err.Error()))
|
||||
return nil
|
||||
}
|
||||
err = sender.Send([]string{payload.Email}, payload.Subject, payload.Content)
|
||||
var content string
|
||||
switch payload.Type {
|
||||
case types.EmailTypeVerify:
|
||||
tpl, _ := template.New("verify").Parse(l.svcCtx.Config.Email.VerifyEmailTemplate)
|
||||
var result bytes.Buffer
|
||||
|
||||
payload.Content["Type"] = uint8(payload.Content["Type"].(float64))
|
||||
|
||||
err = tpl.Execute(&result, payload.Content)
|
||||
if err != nil {
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] Execute template failed",
|
||||
logger.Field("error", err.Error()),
|
||||
logger.Field("data", payload.Content),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
content = result.String()
|
||||
case types.EmailTypeMaintenance:
|
||||
tpl, _ := template.New("maintenance").Parse(l.svcCtx.Config.Email.MaintenanceEmailTemplate)
|
||||
var result bytes.Buffer
|
||||
err = tpl.Execute(&result, payload.Content)
|
||||
if err != nil {
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] Execute template failed",
|
||||
logger.Field("error", err.Error()),
|
||||
logger.Field("template", l.svcCtx.Config.Email.MaintenanceEmailTemplate),
|
||||
logger.Field("data", payload.Content),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
content = result.String()
|
||||
case types.EmailTypeExpiration:
|
||||
tpl, _ := template.New("expiration").Parse(l.svcCtx.Config.Email.ExpirationEmailTemplate)
|
||||
var result bytes.Buffer
|
||||
err = tpl.Execute(&result, payload.Content)
|
||||
if err != nil {
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] Execute template failed",
|
||||
logger.Field("error", err.Error()),
|
||||
logger.Field("template", l.svcCtx.Config.Email.ExpirationEmailTemplate),
|
||||
logger.Field("data", payload.Content),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
content = result.String()
|
||||
case types.EmailTypeTrafficExceed:
|
||||
tpl, _ := template.New("traffic_exceed").Parse(l.svcCtx.Config.Email.TrafficExceedEmailTemplate)
|
||||
var result bytes.Buffer
|
||||
err = tpl.Execute(&result, payload.Content)
|
||||
if err != nil {
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] Execute template failed",
|
||||
logger.Field("error", err.Error()),
|
||||
logger.Field("template", l.svcCtx.Config.Email.TrafficExceedEmailTemplate),
|
||||
logger.Field("data", payload.Content),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
content = result.String()
|
||||
case types.EmailTypeCustom:
|
||||
if payload.Content == nil {
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] Custom email content is empty",
|
||||
logger.Field("payload", payload),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
if tpl, ok := payload.Content["content"].(string); !ok {
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] Custom email content is not a string",
|
||||
logger.Field("payload", payload),
|
||||
)
|
||||
return nil
|
||||
} else {
|
||||
content = tpl
|
||||
}
|
||||
default:
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] Unsupported email type",
|
||||
logger.Field("type", payload.Type),
|
||||
logger.Field("payload", payload),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
|
||||
err = sender.Send([]string{payload.Email}, payload.Subject, content)
|
||||
if err != nil {
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] Send email failed", logger.Field("error", err.Error()))
|
||||
return nil
|
||||
}
|
||||
messageLog.Status = 1
|
||||
if err = l.svcCtx.LogModel.InsertMessageLog(ctx, &messageLog); err != nil {
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] InsertMessageLog failed",
|
||||
emailLog, err := messageLog.Marshal()
|
||||
if err != nil {
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] Marshal message log failed",
|
||||
logger.Field("error", err.Error()),
|
||||
logger.Field("messageLog", messageLog),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
|
||||
if err = l.svcCtx.LogModel.Insert(ctx, &log.SystemLog{
|
||||
Type: log.TypeEmailMessage.Uint8(),
|
||||
Date: time.Now().Format("2006-01-02"),
|
||||
ObjectID: 0,
|
||||
Content: string(emailLog),
|
||||
}); err != nil {
|
||||
logger.WithContext(ctx).Error("[SendEmailLogic] Insert email log failed",
|
||||
logger.Field("error", err.Error()),
|
||||
logger.Field("emailLog", string(emailLog)),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
logger.WithContext(ctx).Info("[SendEmailLogic] Send email", logger.Field("email", payload.Email), logger.Field("content", payload.Content))
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user