48 lines
1.4 KiB
Go
48 lines
1.4 KiB
Go
|
|
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
|
||
|
|
}
|