package analytics import ( "context" "encoding/json" "fmt" "tercul/internal/app/analytics" "github.com/hibiken/asynq" ) type Worker struct { analyticsService analytics.Service } func NewWorker(analyticsService analytics.Service) *Worker { return &Worker{analyticsService: analyticsService} } func (w *Worker) ProcessTask(ctx context.Context, t *asynq.Task) error { var event analytics.AnalyticsEvent if err := json.Unmarshal(t.Payload(), &event); err != nil { return fmt.Errorf("failed to unmarshal analytics event: %w", err) } switch event.EventType { case analytics.EventTypeWorkViewed: if event.WorkID != nil { return w.analyticsService.IncrementWorkViews(ctx, *event.WorkID) } case analytics.EventTypeWorkLiked: if event.WorkID != nil { return w.analyticsService.IncrementWorkLikes(ctx, *event.WorkID) } case analytics.EventTypeWorkCommented: if event.WorkID != nil { return w.analyticsService.IncrementWorkComments(ctx, *event.WorkID) } case analytics.EventTypeWorkBookmarked: if event.WorkID != nil { return w.analyticsService.IncrementWorkBookmarks(ctx, *event.WorkID) } case analytics.EventTypeTranslationViewed: if event.TranslationID != nil { return w.analyticsService.IncrementTranslationViews(ctx, *event.TranslationID) } case analytics.EventTypeTranslationLiked: if event.TranslationID != nil { return w.analyticsService.IncrementTranslationLikes(ctx, *event.TranslationID) } case analytics.EventTypeTranslationCommented: if event.TranslationID != nil { return w.analyticsService.IncrementTranslationComments(ctx, *event.TranslationID) } default: return fmt.Errorf("unknown analytics event type: %s", event.EventType) } return nil }