61 lines
1.7 KiB
Go
61 lines
1.7 KiB
Go
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
|
|
}
|
|
}
|