haixunMaster/haixun-backend/internal/worker/job/placement_scope.go

101 lines
2.6 KiB
Go
Raw Normal View History

2026-06-24 16:48:56 +00:00
package job
import (
"context"
"strings"
branddomain "haixun-backend/internal/model/brand/domain/usecase"
topicdomain "haixun-backend/internal/model/placement_topic/domain/usecase"
)
type placementScope struct {
TopicID string
CatalogBrand string
Topic *topicdomain.TopicSummary
Brand *branddomain.BrandSummary
}
func topicIDFromPayload(payload map[string]any) string {
return strings.TrimSpace(stringField(payload, "topic_id"))
}
func resolvePlacementScope(
ctx context.Context,
brandUC branddomain.UseCase,
topicUC topicdomain.UseCase,
tenantID, ownerUID string,
payload map[string]any,
) (*placementScope, error) {
topicID := topicIDFromPayload(payload)
catalogBrandID := strings.TrimSpace(stringField(payload, "brand_id"))
if catalogBrandID == "" {
catalogBrandID = brandIDFromPayload(payload)
}
if topicID != "" {
topic, err := topicUC.Get(ctx, tenantID, ownerUID, topicID)
if err != nil {
return nil, err
}
catalogBrandID = topic.BrandID
catalog, err := brandUC.Get(ctx, tenantID, ownerUID, catalogBrandID)
if err != nil {
return nil, err
}
merged := *catalog
merged.TopicName = topic.TopicName
merged.SeedQuery = topic.SeedQuery
merged.Brief = topic.Brief
merged.ProductID = topic.ProductID
merged.ResearchMap = topic.ResearchMap
return &placementScope{
TopicID: topicID,
CatalogBrand: catalogBrandID,
Topic: topic,
Brand: &merged,
}, nil
}
brand, err := brandUC.Get(ctx, tenantID, ownerUID, catalogBrandID)
if err != nil {
return nil, err
}
return &placementScope{
CatalogBrand: catalogBrandID,
Brand: brand,
}, nil
}
func placementTopicAsBrand(scope *placementScope, topic *topicdomain.TopicSummary) *branddomain.BrandSummary {
if scope == nil || scope.Brand == nil || topic == nil {
return scope.Brand
}
out := *scope.Brand
out.TopicName = topic.TopicName
out.SeedQuery = topic.SeedQuery
out.Brief = topic.Brief
out.ProductID = topic.ProductID
out.ResearchMap = topic.ResearchMap
return &out
}
2026-06-25 08:20:03 +00:00
func reloadScopeBrand(
ctx context.Context,
deps ExpandGraphDeps,
tenantID, ownerUID string,
scope *placementScope,
) (*branddomain.BrandSummary, error) {
if scope == nil || scope.Brand == nil {
return nil, nil
}
if scope.TopicID != "" && deps.PlacementTopic != nil {
topic, err := deps.PlacementTopic.Get(ctx, tenantID, ownerUID, scope.TopicID)
if err != nil {
return nil, err
}
return placementTopicAsBrand(scope, topic), nil
}
if deps.Brand != nil && strings.TrimSpace(scope.CatalogBrand) != "" {
return deps.Brand.Get(ctx, tenantID, ownerUID, scope.CatalogBrand)
}
return scope.Brand, nil
}