This commit is contained in:
2025-09-12 01:15:09 +08:00
parent c563b2266b
commit e05ad9e223
103 changed files with 20034 additions and 1041 deletions

View File

@@ -10,20 +10,21 @@ import (
"tyapi-server/internal/domains/article/repositories"
repoQueries "tyapi-server/internal/domains/article/repositories/queries"
"tyapi-server/internal/domains/article/services"
"tyapi-server/internal/infrastructure/task"
"tyapi-server/internal/shared/interfaces"
task_entities "tyapi-server/internal/infrastructure/task/entities"
task_interfaces "tyapi-server/internal/infrastructure/task/interfaces"
shared_interfaces "tyapi-server/internal/shared/interfaces"
"go.uber.org/zap"
)
// ArticleApplicationServiceImpl 文章应用服务实现
type ArticleApplicationServiceImpl struct {
articleRepo repositories.ArticleRepository
categoryRepo repositories.CategoryRepository
tagRepo repositories.TagRepository
articleService *services.ArticleService
asynqClient *task.AsynqClient
logger *zap.Logger
articleRepo repositories.ArticleRepository
categoryRepo repositories.CategoryRepository
tagRepo repositories.TagRepository
articleService *services.ArticleService
taskManager task_interfaces.TaskManager
logger *zap.Logger
}
// NewArticleApplicationService 创建文章应用服务
@@ -32,7 +33,7 @@ func NewArticleApplicationService(
categoryRepo repositories.CategoryRepository,
tagRepo repositories.TagRepository,
articleService *services.ArticleService,
asynqClient *task.AsynqClient,
taskManager task_interfaces.TaskManager,
logger *zap.Logger,
) ArticleApplicationService {
return &ArticleApplicationServiceImpl{
@@ -40,7 +41,7 @@ func NewArticleApplicationService(
categoryRepo: categoryRepo,
tagRepo: tagRepo,
articleService: articleService,
asynqClient: asynqClient,
taskManager: taskManager,
logger: logger,
}
}
@@ -337,32 +338,37 @@ func (s *ArticleApplicationServiceImpl) SchedulePublishArticle(ctx context.Conte
return fmt.Errorf("文章不存在: %w", err)
}
// 3. 如果已有定时任务,先取消
if article.TaskID != "" {
if err := s.asynqClient.CancelScheduledTask(ctx, article.TaskID); err != nil {
s.logger.Warn("取消旧定时任务失败", zap.String("task_id", article.TaskID), zap.Error(err))
}
// 3. 取消旧任务
if err := s.taskManager.CancelTask(ctx, cmd.ID); err != nil {
s.logger.Warn("取消旧任务失败", zap.String("article_id", cmd.ID), zap.Error(err))
}
// 4. 调度定时发布任务
taskID, err := s.asynqClient.ScheduleArticlePublish(ctx, cmd.ID, scheduledTime)
if err != nil {
s.logger.Error("调度定时发布任务失败", zap.String("id", cmd.ID), zap.Error(err))
return fmt.Errorf("调度定时发布任务失败: %w", err)
// 4. 创建任务工厂
taskFactory := task_entities.NewTaskFactoryWithManager(s.taskManager)
// 5. 创建并异步入队文章发布任务
if err := taskFactory.CreateAndEnqueueArticlePublishTask(
ctx,
cmd.ID,
scheduledTime,
"system", // 暂时使用系统用户ID
); err != nil {
s.logger.Error("创建并入队文章发布任务失败", zap.Error(err))
return err
}
// 5. 设置定时发布
if err := article.SchedulePublish(scheduledTime, taskID); err != nil {
// 6. 设置定时发布
if err := article.SchedulePublish(scheduledTime); err != nil {
return fmt.Errorf("设置定时发布失败: %w", err)
}
// 6. 保存更新
// 7. 保存更新
if err := s.articleRepo.Update(ctx, article); err != nil {
s.logger.Error("更新文章失败", zap.String("id", article.ID), zap.Error(err))
return fmt.Errorf("设置定时发布失败: %w", err)
}
s.logger.Info("设置定时发布成功", zap.String("id", article.ID), zap.Time("scheduled_time", scheduledTime), zap.String("task_id", taskID))
s.logger.Info("设置定时发布成功", zap.String("id", article.ID), zap.Time("scheduled_time", scheduledTime))
return nil
}
@@ -381,10 +387,9 @@ func (s *ArticleApplicationServiceImpl) CancelSchedulePublishArticle(ctx context
}
// 3. 取消定时任务
if article.TaskID != "" {
if err := s.asynqClient.CancelScheduledTask(ctx, article.TaskID); err != nil {
s.logger.Warn("取消定时任务失败", zap.String("task_id", article.TaskID), zap.Error(err))
}
if err := s.taskManager.CancelTask(ctx, cmd.ID); err != nil {
s.logger.Warn("取消定时任务失败", zap.String("article_id", cmd.ID), zap.Error(err))
// 不返回错误,继续执行取消定时发布
}
// 4. 取消定时发布
@@ -613,7 +618,7 @@ func (s *ArticleApplicationServiceImpl) GetCategoryByID(ctx context.Context, que
// ListCategories 获取分类列表
func (s *ArticleApplicationServiceImpl) ListCategories(ctx context.Context) (*responses.CategoryListResponse, error) {
// 1. 获取分类列表
categories, err := s.categoryRepo.List(ctx, interfaces.ListOptions{})
categories, err := s.categoryRepo.List(ctx, shared_interfaces.ListOptions{})
if err != nil {
s.logger.Error("获取分类列表失败", zap.Error(err))
return nil, fmt.Errorf("获取分类列表失败: %w", err)
@@ -730,7 +735,7 @@ func (s *ArticleApplicationServiceImpl) GetTagByID(ctx context.Context, query *a
// ListTags 获取标签列表
func (s *ArticleApplicationServiceImpl) ListTags(ctx context.Context) (*responses.TagListResponse, error) {
// 1. 获取标签列表
tags, err := s.tagRepo.List(ctx, interfaces.ListOptions{})
tags, err := s.tagRepo.List(ctx, shared_interfaces.ListOptions{})
if err != nil {
s.logger.Error("获取标签列表失败", zap.Error(err))
return nil, fmt.Errorf("获取标签列表失败: %w", err)
@@ -776,15 +781,14 @@ func (s *ArticleApplicationServiceImpl) UpdateSchedulePublishArticle(ctx context
return fmt.Errorf("文章未设置定时发布,无法修改时间")
}
// 4. 重新调度定时发布任务
newTaskID, err := s.asynqClient.RescheduleArticlePublish(ctx, cmd.ID, article.TaskID, scheduledTime)
if err != nil {
s.logger.Error("重新调度定时发布任务失败", zap.String("id", cmd.ID), zap.Error(err))
// 4. 更新数据库中的任务调度时间
if err := s.taskManager.UpdateTaskSchedule(ctx, cmd.ID, scheduledTime); err != nil {
s.logger.Error("更新任务调度时间失败", zap.String("id", cmd.ID), zap.Error(err))
return fmt.Errorf("修改定时发布时间失败: %w", err)
}
// 5. 更新定时发布
if err := article.UpdateSchedulePublish(scheduledTime, newTaskID); err != nil {
if err := article.UpdateSchedulePublish(scheduledTime); err != nil {
return fmt.Errorf("更新定时发布失败: %w", err)
}
@@ -796,8 +800,7 @@ func (s *ArticleApplicationServiceImpl) UpdateSchedulePublishArticle(ctx context
s.logger.Info("修改定时发布时间成功",
zap.String("id", article.ID),
zap.Time("new_scheduled_time", scheduledTime),
zap.String("new_task_id", newTaskID))
zap.Time("new_scheduled_time", scheduledTime))
return nil
}