2026-06-26 08:37:04 +00:00
|
|
|
package entity
|
|
|
|
|
|
|
|
|
|
const CollectionName = "copy_missions"
|
|
|
|
|
|
|
|
|
|
type Status string
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
StatusOpen Status = "open"
|
|
|
|
|
StatusMapped Status = "mapped"
|
|
|
|
|
StatusScanned Status = "scanned"
|
|
|
|
|
StatusDrafted Status = "drafted"
|
|
|
|
|
StatusArchived Status = "archived"
|
|
|
|
|
StatusDeleted Status = "deleted"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type SuggestedTag struct {
|
|
|
|
|
Tag string `bson:"tag" json:"tag"`
|
|
|
|
|
Reason string `bson:"reason,omitempty" json:"reason,omitempty"`
|
|
|
|
|
SearchIntent string `bson:"search_intent,omitempty" json:"search_intent,omitempty"`
|
|
|
|
|
SearchType string `bson:"search_type,omitempty" json:"search_type,omitempty"`
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-28 08:28:42 +00:00
|
|
|
const (
|
|
|
|
|
SimilarAccountStatusRecommended = "recommended"
|
|
|
|
|
SimilarAccountStatusPinned = "pinned"
|
|
|
|
|
SimilarAccountStatusExcluded = "excluded"
|
|
|
|
|
SimilarAccountStatusPromoted = "promoted"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
AudienceSampleStatusPinned = "pinned"
|
|
|
|
|
AudienceSampleStatusExcluded = "excluded"
|
|
|
|
|
)
|
|
|
|
|
|
2026-06-26 08:37:04 +00:00
|
|
|
type SimilarAccount struct {
|
2026-06-28 08:28:42 +00:00
|
|
|
Username string `bson:"username" json:"username"`
|
|
|
|
|
Reason string `bson:"reason,omitempty" json:"reason,omitempty"`
|
|
|
|
|
Source string `bson:"source,omitempty" json:"source,omitempty"`
|
|
|
|
|
MatchedSource []string `bson:"matched_source,omitempty" json:"matched_source,omitempty"`
|
|
|
|
|
Confidence string `bson:"confidence,omitempty" json:"confidence,omitempty"`
|
|
|
|
|
Status string `bson:"status,omitempty" json:"status,omitempty"`
|
|
|
|
|
TopicRelevance float64 `bson:"topic_relevance,omitempty" json:"topic_relevance,omitempty"`
|
|
|
|
|
LastSeenAt int64 `bson:"last_seen_at,omitempty" json:"last_seen_at,omitempty"`
|
|
|
|
|
ProfileURL string `bson:"profile_url,omitempty" json:"profile_url,omitempty"`
|
|
|
|
|
AuthorVerified bool `bson:"author_verified,omitempty" json:"author_verified,omitempty"`
|
|
|
|
|
FollowerCount int `bson:"follower_count,omitempty" json:"follower_count,omitempty"`
|
|
|
|
|
EngagementScore int `bson:"engagement_score,omitempty" json:"engagement_score,omitempty"`
|
|
|
|
|
LikeCount int `bson:"like_count,omitempty" json:"like_count,omitempty"`
|
|
|
|
|
ReplyCount int `bson:"reply_count,omitempty" json:"reply_count,omitempty"`
|
|
|
|
|
PostCount int `bson:"post_count,omitempty" json:"post_count,omitempty"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ResearchItem struct {
|
|
|
|
|
Title string `bson:"title,omitempty" json:"title,omitempty"`
|
|
|
|
|
URL string `bson:"url,omitempty" json:"url,omitempty"`
|
|
|
|
|
Snippet string `bson:"snippet,omitempty" json:"snippet,omitempty"`
|
|
|
|
|
Query string `bson:"query,omitempty" json:"query,omitempty"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type AudienceSample struct {
|
|
|
|
|
Username string `bson:"username" json:"username"`
|
|
|
|
|
SamplePostID string `bson:"sample_post_id,omitempty" json:"sample_post_id,omitempty"`
|
|
|
|
|
SampleText string `bson:"sample_text,omitempty" json:"sample_text,omitempty"`
|
|
|
|
|
ReplyLikeCount int `bson:"reply_like_count,omitempty" json:"reply_like_count,omitempty"`
|
|
|
|
|
Appearances int `bson:"appearances,omitempty" json:"appearances,omitempty"`
|
|
|
|
|
FirstSeenAt int64 `bson:"first_seen_at" json:"first_seen_at"`
|
|
|
|
|
LastSeenAt int64 `bson:"last_seen_at,omitempty" json:"last_seen_at,omitempty"`
|
|
|
|
|
Status string `bson:"status,omitempty" json:"status,omitempty"`
|
2026-06-26 08:37:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ResearchMap struct {
|
2026-06-28 08:28:42 +00:00
|
|
|
AudienceSummary string `bson:"audience_summary,omitempty" json:"audience_summary,omitempty"`
|
|
|
|
|
ContentGoal string `bson:"content_goal,omitempty" json:"content_goal,omitempty"`
|
|
|
|
|
Questions []string `bson:"questions,omitempty" json:"questions,omitempty"`
|
|
|
|
|
Pillars []string `bson:"pillars,omitempty" json:"pillars,omitempty"`
|
|
|
|
|
Exclusions []string `bson:"exclusions,omitempty" json:"exclusions,omitempty"`
|
|
|
|
|
KnowledgeItems []string `bson:"knowledge_items,omitempty" json:"knowledge_items,omitempty"`
|
|
|
|
|
SelectedKnowledgeItems []string `bson:"selected_knowledge_items,omitempty" json:"selected_knowledge_items,omitempty"`
|
|
|
|
|
ResearchItems []ResearchItem `bson:"research_items,omitempty" json:"research_items,omitempty"`
|
|
|
|
|
SuggestedTags []SuggestedTag `bson:"suggested_tags,omitempty" json:"suggested_tags,omitempty"`
|
|
|
|
|
SimilarAccounts []SimilarAccount `bson:"similar_accounts,omitempty" json:"similar_accounts,omitempty"`
|
|
|
|
|
AudienceSamples []AudienceSample `bson:"audience_samples,omitempty" json:"audience_samples,omitempty"`
|
|
|
|
|
BenchmarkNotes string `bson:"benchmark_notes,omitempty" json:"benchmark_notes,omitempty"`
|
2026-06-26 08:37:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m ResearchMap) IsEmpty() bool {
|
|
|
|
|
return m.AudienceSummary == "" &&
|
|
|
|
|
m.ContentGoal == "" &&
|
|
|
|
|
len(m.Questions) == 0 &&
|
2026-06-28 08:28:42 +00:00
|
|
|
len(m.KnowledgeItems) == 0 &&
|
2026-06-26 08:37:04 +00:00
|
|
|
len(m.SuggestedTags) == 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Mission struct {
|
|
|
|
|
ID string `bson:"_id"`
|
|
|
|
|
TenantID string `bson:"tenant_id"`
|
|
|
|
|
OwnerUID string `bson:"owner_uid"`
|
|
|
|
|
PersonaID string `bson:"persona_id"`
|
|
|
|
|
Label string `bson:"label,omitempty"`
|
|
|
|
|
SeedQuery string `bson:"seed_query,omitempty"`
|
|
|
|
|
Brief string `bson:"brief,omitempty"`
|
|
|
|
|
ResearchMap ResearchMap `bson:"research_map,omitempty"`
|
|
|
|
|
SelectedTags []string `bson:"selected_tags,omitempty"`
|
|
|
|
|
LastScanJobID string `bson:"last_scan_job_id,omitempty"`
|
|
|
|
|
Status Status `bson:"status"`
|
|
|
|
|
CreateAt int64 `bson:"create_at"`
|
|
|
|
|
UpdateAt int64 `bson:"update_at"`
|
|
|
|
|
}
|