package queue import ( "encoding/json" "time" "github.com/google/uuid" "github.com/hibiken/asynq" ) const ( TypeDispatchChannel = "ai:dispatch-channel" TypeSubmitTask = "ai:submit-task" TypePollTask = "ai:poll-task" TypeDownloadTask = "ai:download-task" TypeAnalyzeEpisode = "media:analyze-episode" TypeParseDramaEpisode = "drama:parse-episode" TypeAnalyzeScript = "script:analyze" ) type IDPayload struct { ID uuid.UUID `json:"id"` } func NewIDTask(taskType string, id uuid.UUID) (*asynq.Task, error) { payload, err := json.Marshal(IDPayload{ID: id}) if err != nil { return nil, err } return asynq.NewTask(taskType, payload), nil } func EnqueueID(client *asynq.Client, taskType string, id uuid.UUID, delay time.Duration) error { task, err := NewIDTask(taskType, id) if err != nil { return err } maxRetry := 0 if taskType == TypeDispatchChannel || taskType == TypePollTask || taskType == TypeDownloadTask { maxRetry = 5 } options := []asynq.Option{asynq.MaxRetry(maxRetry), asynq.Queue("ai")} if delay > 0 { options = append(options, asynq.ProcessIn(delay)) } _, err = client.Enqueue(task, options...) return err }