package scheduler import ( "context" "encoding/json" "fmt" "time" "github.com/google/uuid" "github.com/hibiken/asynq" ) const TypeReminder = "reminder:send" type ReminderPayload struct { EventID uuid.UUID `json:"event_id"` ReminderID uuid.UUID `json:"reminder_id"` UserID uuid.UUID `json:"user_id"` } type Scheduler struct { client *asynq.Client } func NewScheduler(redisAddr string) *Scheduler { client := asynq.NewClient(asynq.RedisClientOpt{Addr: redisAddr}) return &Scheduler{client: client} } func (s *Scheduler) ScheduleReminder(_ context.Context, eventID, reminderID, userID uuid.UUID, triggerAt time.Time) error { payload, err := json.Marshal(ReminderPayload{ EventID: eventID, ReminderID: reminderID, UserID: userID, }) if err != nil { return fmt.Errorf("marshal reminder payload: %w", err) } task := asynq.NewTask(TypeReminder, payload) _, err = s.client.Enqueue(task, asynq.ProcessAt(triggerAt), asynq.MaxRetry(5), asynq.Queue("reminders"), ) if err != nil { return fmt.Errorf("enqueue reminder: %w", err) } return nil } func (s *Scheduler) Close() error { return s.client.Close() } type NoopScheduler struct{} func (NoopScheduler) ScheduleReminder(_ context.Context, _, _, _ uuid.UUID, _ time.Time) error { return nil } func (NoopScheduler) Close() error { return nil }