框架化

This commit is contained in:
ryan
2026-06-08 15:33:50 +08:00
parent b03d2d7ea6
commit 5c7c995a95
5 changed files with 129 additions and 119 deletions
+9 -37
View File
@@ -17,7 +17,6 @@ limitations under the License.
package task
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
@@ -81,44 +80,17 @@ func DispatchTask(c *gin.Context) {
}
var payloadBytes []byte
if req.TaskType == task.TaskTypeSendEmail {
if strings.TrimSpace(req.Payload) == "" {
c.JSON(http.StatusBadRequest, util.Err("任务参数 Payload 不能为空"))
return
}
var mailPayload struct {
To string `json:"to"`
Subject string `json:"subject"`
Body string `json:"body"`
}
if err := json.Unmarshal([]byte(req.Payload), &mailPayload); err != nil {
c.JSON(http.StatusBadRequest, util.Err("无效的 JSON 格式: "+err.Error()))
return
}
mailPayload.To = strings.TrimSpace(mailPayload.To)
mailPayload.Subject = strings.TrimSpace(mailPayload.Subject)
mailPayload.Body = strings.TrimSpace(mailPayload.Body)
if mailPayload.To == "" || mailPayload.Subject == "" || mailPayload.Body == "" {
c.JSON(http.StatusBadRequest, util.Err("收件人地址 (to)、邮件主题 (subject) 和邮件内容 (body) 不能为空"))
return
}
var err error
payloadBytes, err = json.Marshal(mailPayload)
if err != nil {
c.JSON(http.StatusInternalServerError, util.Err("构造邮件任务载荷失败"))
return
}
} else {
if req.Payload != "" {
payloadBytes = []byte(req.Payload)
}
if strings.TrimSpace(req.Payload) != "" {
payloadBytes = []byte(req.Payload)
}
taskID, err := task.DispatchTask(c.Request.Context(), req.TaskType, payloadBytes, "manual")
validated, err := task.ValidateAndNormalizePayload(meta.AsynqTask, payloadBytes)
if err != nil {
c.JSON(http.StatusBadRequest, util.Err(err.Error()))
return
}
taskID, err := task.DispatchTask(c.Request.Context(), req.TaskType, validated, "manual")
if err != nil {
c.JSON(http.StatusInternalServerError, util.Err(fmt.Sprintf("%s: %v", TaskDispatchFailed, err)))
return
+24
View File
@@ -22,6 +22,7 @@ import (
"errors"
"fmt"
"strconv"
"strings"
"github.com/linux-do/credit/internal/model"
"github.com/linux-do/credit/internal/task"
@@ -38,6 +39,29 @@ type SendEmailPayload struct {
// SendEmailHandler 发送验证码邮件的异步任务处理器
type SendEmailHandler struct{}
// ValidatePayload 实现 task.PayloadValidator 接口
// 校验并标准化邮件发送参数,框架在 Admin 下发时自动调用
func (h *SendEmailHandler) ValidatePayload(payload []byte) ([]byte, error) {
if len(payload) == 0 {
return nil, errors.New("任务参数不能为空")
}
var req SendEmailPayload
if err := json.Unmarshal(payload, &req); err != nil {
return nil, fmt.Errorf("无效的 JSON 格式: %w", err)
}
req.To = strings.TrimSpace(req.To)
req.Subject = strings.TrimSpace(req.Subject)
req.Body = strings.TrimSpace(req.Body)
if req.To == "" || req.Subject == "" || req.Body == "" {
return nil, errors.New("to、subject、body 不能为空")
}
return json.Marshal(req)
}
// Execute 执行邮件异步发送逻辑
func (h *SendEmailHandler) Execute(ctx context.Context, payload []byte) (*task.TaskResult, error) {
var req SendEmailPayload