thread-master/apps/backend/internal/module/radar/domain/demand_map.go

72 lines
2.7 KiB
Go
Raw Normal View History

2026-08-13 02:22:24 +00:00
package domain
import (
"strings"
)
type DemandMapPhrase struct {
Text string `bson:"text" json:"text"`
Kind string `bson:"kind" json:"kind"`
BasisKind string `bson:"basis_kind,omitempty" json:"basis_kind,omitempty"`
BasisText string `bson:"basis_text,omitempty" json:"basis_text,omitempty"`
Origin string `bson:"origin" json:"origin"`
Enabled bool `bson:"enabled" json:"enabled"`
}
type DemandMap struct {
ID string `bson:"_id" json:"id"`
OwnerUID int64 `bson:"owner_uid" json:"owner_uid"`
ProductID string `bson:"product_id" json:"product_id"`
DemandInputVersion string `bson:"demand_input_version" json:"demand_input_version"`
MapVersion int64 `bson:"map_version" json:"map_version"`
State string `bson:"state" json:"state"`
PainPhrases []DemandMapPhrase `bson:"pain_phrases" json:"pain_phrases"`
ScenarioPhrases []DemandMapPhrase `bson:"scenario_phrases" json:"scenario_phrases"`
DesiredOutcomes []DemandMapPhrase `bson:"desired_outcomes" json:"desired_outcomes"`
SolutionSignals []DemandMapPhrase `bson:"solution_signals" json:"solution_signals"`
ExclusionSignals []DemandMapPhrase `bson:"exclusion_signals" json:"exclusion_signals"`
SourceBasis []string `bson:"source_basis" json:"source_basis"`
CustomPhrases []DemandMapPhrase `bson:"custom_phrases" json:"custom_phrases"`
AIEnrichedAt int64 `bson:"ai_enriched_at,omitempty" json:"ai_enriched_at,omitempty"`
UpdatedAt int64 `bson:"updated_at" json:"updated_at"`
}
func (m *DemandMap) Normalize() error {
if m.OwnerUID <= 0 || strings.TrimSpace(m.ProductID) == "" || strings.TrimSpace(m.DemandInputVersion) == "" {
return ErrValidation
}
if m.MapVersion < 1 {
m.MapVersion = 1
}
if m.State != "ready" && m.State != "incomplete" && m.State != "stale" {
return ErrValidation
}
for i := range m.PainPhrases {
normalizeDemandPhrase(&m.PainPhrases[i])
}
for i := range m.ScenarioPhrases {
normalizeDemandPhrase(&m.ScenarioPhrases[i])
}
for i := range m.DesiredOutcomes {
normalizeDemandPhrase(&m.DesiredOutcomes[i])
}
for i := range m.SolutionSignals {
normalizeDemandPhrase(&m.SolutionSignals[i])
}
for i := range m.ExclusionSignals {
normalizeDemandPhrase(&m.ExclusionSignals[i])
}
for i := range m.CustomPhrases {
normalizeDemandPhrase(&m.CustomPhrases[i])
}
return nil
}
func normalizeDemandPhrase(p *DemandMapPhrase) {
p.Text = strings.TrimSpace(p.Text)
p.Kind = strings.TrimSpace(p.Kind)
p.BasisKind = strings.TrimSpace(p.BasisKind)
p.BasisText = strings.TrimSpace(p.BasisText)
p.Origin = strings.TrimSpace(p.Origin)
}