59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
|
|
package task
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"encoding/json"
|
||
|
|
"fmt"
|
||
|
|
|
||
|
|
"github.com/hibiken/asynq"
|
||
|
|
"go.uber.org/zap"
|
||
|
|
)
|
||
|
|
|
||
|
|
// ArticlePublisher 文章发布接口
|
||
|
|
type ArticlePublisher interface {
|
||
|
|
PublishArticleByID(ctx context.Context, articleID string) error
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArticleTaskHandler 文章任务处理器
|
||
|
|
type ArticleTaskHandler struct {
|
||
|
|
publisher ArticlePublisher
|
||
|
|
logger *zap.Logger
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewArticleTaskHandler 创建文章任务处理器
|
||
|
|
func NewArticleTaskHandler(
|
||
|
|
publisher ArticlePublisher,
|
||
|
|
logger *zap.Logger,
|
||
|
|
) *ArticleTaskHandler {
|
||
|
|
return &ArticleTaskHandler{
|
||
|
|
publisher: publisher,
|
||
|
|
logger: logger,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// HandleArticlePublish 处理文章定时发布任务
|
||
|
|
func (h *ArticleTaskHandler) HandleArticlePublish(ctx context.Context, t *asynq.Task) error {
|
||
|
|
var payload map[string]interface{}
|
||
|
|
if err := json.Unmarshal(t.Payload(), &payload); err != nil {
|
||
|
|
h.logger.Error("解析任务载荷失败", zap.Error(err))
|
||
|
|
return fmt.Errorf("解析任务载荷失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
articleID, ok := payload["article_id"].(string)
|
||
|
|
if !ok {
|
||
|
|
h.logger.Error("任务载荷中缺少文章ID")
|
||
|
|
return fmt.Errorf("任务载荷中缺少文章ID")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 执行文章发布
|
||
|
|
if err := h.publisher.PublishArticleByID(ctx, articleID); err != nil {
|
||
|
|
h.logger.Error("定时发布文章失败",
|
||
|
|
zap.String("article_id", articleID),
|
||
|
|
zap.Error(err))
|
||
|
|
return fmt.Errorf("定时发布文章失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
h.logger.Info("定时发布文章成功", zap.String("article_id", articleID))
|
||
|
|
return nil
|
||
|
|
}
|