// Code scaffolded by goctl. Safe to edit. // goctl 1.10.1 package persona import ( "context" "fmt" "haixun-backend/internal/library/publishschedule" copydraftdomain "haixun-backend/internal/model/copy_draft/domain/usecase" pqdomain "haixun-backend/internal/model/publish_queue/domain/usecase" "haixun-backend/internal/svc" "haixun-backend/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type SchedulePersonaDraftsLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewSchedulePersonaDraftsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SchedulePersonaDraftsLogic { return &SchedulePersonaDraftsLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *SchedulePersonaDraftsLogic) SchedulePersonaDrafts(req *types.SchedulePersonaDraftsHandlerReq) (resp *types.ScheduleCopyDraftsData, err error) { tenantID, uid, err := actorFrom(l.ctx) if err != nil { return nil, err } if _, err := l.svcCtx.Persona.Get(l.ctx, tenantID, uid, req.ID); err != nil { return nil, err } if _, err := l.svcCtx.ThreadsAccount.Get(l.ctx, tenantID, uid, req.AccountID); err != nil { return nil, err } times := scheduleTimes(req.StartAt, req.Timezone, req.Slots, len(req.DraftIDs)) list := make([]types.PublishQueueItemData, 0, len(req.DraftIDs)) for idx, draftID := range req.DraftIDs { draft, err := l.svcCtx.CopyDraft.Get(l.ctx, tenantID, uid, req.ID, draftID) if err != nil { return nil, err } scheduledAt := int64(0) if idx < len(times) { scheduledAt = times[idx] } item, err := l.svcCtx.PublishQueue.Create(l.ctx, pqdomain.CreateRequest{ TenantID: tenantID, OwnerUID: uid, AccountID: req.AccountID, PersonaID: req.ID, CopyMissionID: draft.CopyMissionID, CopyDraftID: draft.ID, Text: draft.Text, ScheduledAt: scheduledAt, }) if err != nil { return nil, err } _, _ = l.svcCtx.CopyDraft.MarkScheduled(l.ctx, copydraftdomain.MarkScheduledRequest{ TenantID: tenantID, OwnerUID: uid, PersonaID: req.ID, DraftID: draft.ID, QueueID: item.ID, }) list = append(list, publishQueueData(item)) } return &types.ScheduleCopyDraftsData{ Scheduled: len(list), List: list, Message: fmt.Sprintf("已排程 %d 篇草稿", len(list)), }, nil } func scheduleTimes(startAt int64, timezone string, slots []types.PublishSlotData, count int) []int64 { converted := make([]publishschedule.Slot, 0, len(slots)) for _, slot := range slots { converted = append(converted, publishschedule.Slot{Weekday: slot.Weekday, Time: slot.Time}) } return publishschedule.BuildSchedule(startAt, timezone, converted, count) } func publishQueueData(item *pqdomain.QueueItemSummary) types.PublishQueueItemData { if item == nil { return types.PublishQueueItemData{} } return types.PublishQueueItemData{ ID: item.ID, AccountID: item.AccountID, PersonaID: item.PersonaID, CopyMissionID: item.CopyMissionID, CopyDraftID: item.CopyDraftID, Text: item.Text, ScheduledAt: item.ScheduledAt, Status: item.Status, MediaID: item.MediaID, Permalink: item.Permalink, PublishedAt: item.PublishedAt, ErrorMessage: item.ErrorMessage, RetryCount: item.RetryCount, LastAttemptAt: item.LastAttemptAt, NextAttemptAt: item.NextAttemptAt, MissedAt: item.MissedAt, PausedReason: item.PausedReason, CreateAt: item.CreateAt, UpdateAt: item.UpdateAt, } }