package variants import ( "context" "strings" "time" "git.pengzhan.dev/haopengzhan/rsspipe/internal/db" "git.pengzhan.dev/haopengzhan/rsspipe/internal/models" "git.pengzhan.dev/haopengzhan/rsspipe/internal/worker" ) // NewSetVariantHandler creates a worker action handler for attaching extensible variant metadata. func NewSetVariantHandler(database *db.DB) worker.ActionHandler { return func(ctx context.Context, entry models.FeedEntry, params map[string]interface{}) (*worker.ActionResult, error) { key, _ := params["variant_key"].(string) if key == "" { key, _ = params["key"].(string) } if key == "" { return nil, nil } val, _ := params["value"].(string) contentType, _ := params["content_type"].(string) if contentType == "" { contentType = "text" } // If key == "tags", merge with existing tags so multiple rules append tags if key == "tags" { existingVariant, err := database.GetVariant(entry.ID, "tags") if err == nil && existingVariant != nil && existingVariant.TextValue != "" { existingTags := strings.Split(existingVariant.TextValue, ",") newTags := strings.Split(val, ",") tagSet := make(map[string]bool) var merged []string for _, t := range append(existingTags, newTags...) { trimmed := strings.TrimSpace(t) if trimmed != "" && !tagSet[strings.ToLower(trimmed)] { tagSet[strings.ToLower(trimmed)] = true merged = append(merged, trimmed) } } val = strings.Join(merged, ", ") } } variant := models.EntryVariant{ EntryID: entry.ID, VariantKey: key, ContentType: contentType, TextValue: val, CreatedAt: time.Now(), UpdatedAt: time.Now(), } return &worker.ActionResult{ ResultVariant: &variant, }, nil } }