package worker import ( "bytes" "context" "encoding/json" "fmt" "html/template" "time" "api.qobiltu.id/assets" "github.com/hibiken/asynq" ) const ( TaskSendVerifyEmailMaxRetry = 3 TaskSendVerifyEmail = "task:send_verify_email" TaskSendVerifyEmailSubject = "Verifikasi Email" ) type PayloadSendVerifyEmail struct { EmailAddress string `json:"email_address"` VerificationCode string `json:"verification_code"` ExpirationInMinutes int `json:"expiration_in_minutes"` Subject string `json:"subject"` } func (d *RedisTaskDistributor) DistributeTaskSendVerifyEmail( ctx context.Context, payload *PayloadSendVerifyEmail, opts ...asynq.Option, ) error { jsonPayload, err := json.Marshal(payload) if err != nil { return fmt.Errorf("failed to marshal task payload: %w", err) } task := asynq.NewTask(TaskSendVerifyEmail, jsonPayload, opts...) _, err = d.client.EnqueueContext(ctx, task) if err != nil { return fmt.Errorf("failed to enqueue task: %w", err) } return nil } func (p *RedisTaskProcessor) ProcessTaskSendVerifyEmail(ctx context.Context, task *asynq.Task) error { var payload PayloadSendVerifyEmail if err := json.Unmarshal(task.Payload(), &payload); err != nil { return fmt.Errorf("failed to unmarshal payload: %w", asynq.SkipRetry) } var tmpl *template.Template tmpl, err := template.ParseFS(assets.EmbeddedFiles, assets.EmailConfirmationTemplatePath) if err != nil { return fmt.Errorf("failed to parse email template: %w", err) } var body bytes.Buffer if err := tmpl.ExecuteTemplate(&body, "htmlBody", payload); err != nil { return fmt.Errorf("failed to execute email template: %w", err) } htmlContent := body.String() fmt.Println("Sending verification email", payload.EmailAddress) start := time.Now() err = p.emailSender.Send(payload.EmailAddress, payload.Subject, htmlContent, payload) if err != nil { return fmt.Errorf("failed to send verify email: %w", err) } fmt.Println("Verification email sent successfully", payload.EmailAddress) fmt.Println("Time taken", time.Since(start)) return nil }