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

48 lines
1.4 KiB
Go
Raw Normal View History

2026-08-03 05:52:02 +00:00
package domain
import "fmt"
const (
ReplyPublicComment = "public_comment"
ReplyDM = "dm"
ReplyNoSales = "no_sales"
ReplyProfessional = "professional"
ReplyHumorous = "humorous"
SentOutbox = "outbox"
SentManualCopy = "manual_copy"
)
// ReplyVariant is one AI-generated reply draft for an opportunity.
type ReplyVariant struct {
ID string `bson:"_id" json:"id"`
OwnerUID int64 `bson:"owner_uid" json:"owner_uid"`
OpportunityID string `bson:"opportunity_id" json:"opportunity_id"`
Variant string `bson:"variant" json:"variant"`
Text string `bson:"text" json:"text"`
UsedAt int64 `bson:"used_at,omitempty" json:"used_at,omitempty"`
SentChannel string `bson:"sent_channel,omitempty" json:"sent_channel,omitempty"`
CreatedAt int64 `bson:"created_at" json:"created_at"`
}
func IsReplyVariant(s string) bool {
switch s {
case ReplyPublicComment, ReplyDM, ReplyNoSales, ReplyProfessional, ReplyHumorous:
return true
}
return false
}
func (r *ReplyVariant) Normalize() error {
if r.OwnerUID <= 0 || r.OpportunityID == "" {
return fmt.Errorf("%w: owner_uid and opportunity_id required", ErrValidation)
}
if !IsReplyVariant(r.Variant) {
return fmt.Errorf("%w: unknown reply variant %q", ErrValidation, r.Variant)
}
if r.Text == "" {
return fmt.Errorf("%w: reply text required", ErrValidation)
}
return nil
}