thread-master/backend/internal/model/publish_analytics/usecase/schedule.go

62 lines
1.7 KiB
Go
Raw Permalink Normal View History

package usecase
import (
"context"
"strings"
"time"
jobdom "haixun-backend/internal/model/job/domain/usecase"
"haixun-backend/internal/model/publish_analytics/domain/entity"
domusecase "haixun-backend/internal/model/publish_analytics/domain/usecase"
)
const publishAnalyticsTemplateType = "publish-analytics"
func (u *publishAnalyticsUseCase) ScheduleCheckpoints(ctx context.Context, req domusecase.ScheduleCheckpointsRequest) error {
if u.jobs == nil {
return nil
}
tenantID := strings.TrimSpace(req.TenantID)
ownerUID := strings.TrimSpace(req.OwnerUID)
accountID := strings.TrimSpace(req.AccountID)
mediaID := strings.TrimSpace(req.MediaID)
if tenantID == "" || ownerUID == "" || accountID == "" || mediaID == "" {
return nil
}
publishedAt := req.PublishedAt
if publishedAt <= 0 {
publishedAt = time.Now().UnixNano()
}
permalink := strings.TrimSpace(req.Permalink)
checkpoints := []struct {
name string
delay time.Duration
}{
{entity.Checkpoint1h, time.Hour},
{entity.Checkpoint24h, 24 * time.Hour},
{entity.Checkpoint7d, 7 * 24 * time.Hour},
}
for _, cp := range checkpoints {
at := publishedAt + cp.delay.Nanoseconds()
scheduled := at
_, _ = u.jobs.CreateRun(ctx, jobdom.CreateRunRequest{
TemplateType: publishAnalyticsTemplateType,
Scope: "threads_account",
ScopeID: accountID,
TenantID: tenantID,
OwnerUID: ownerUID,
ScheduledAt: &scheduled,
Payload: map[string]any{
"tenant_id": tenantID,
"owner_uid": ownerUID,
"account_id": accountID,
"media_id": mediaID,
"permalink": permalink,
"published_at": publishedAt,
"checkpoint": cp.name,
},
})
}
return nil
}