package verification import ( "strings" "time" "github.com/tech/sendico/pkg/model" "go.mongodb.org/mongo-driver/v2/bson" ) type TokenKind = string const ( TokenKindOTP TokenKind = "otp" TokenKindLink TokenKind = "link" ) type Request struct { AccountRef bson.ObjectID Purpose model.VerificationPurpose Target string Ttl time.Duration Kind TokenKind MaxRetries *int Cooldown *time.Duration IdempotencyKey *string // Optional key to make Create idempotent for retries. } func newRequest(accountRef bson.ObjectID, purpose model.VerificationPurpose, target string, kind TokenKind) *Request { return &Request{ AccountRef: accountRef, Purpose: purpose, Target: target, Kind: kind, Ttl: 15 * time.Minute, // default TTL for verification tokens } } func NewLinkRequest(accountRef bson.ObjectID, purpose model.VerificationPurpose, target string) *Request { return newRequest(accountRef, purpose, target, TokenKindLink) } func NewOTPRequest(accountRef bson.ObjectID, purpose model.VerificationPurpose, target string) *Request { return newRequest(accountRef, purpose, target, TokenKindOTP) } func (r *Request) WithTTL(ttl time.Duration) *Request { r.Ttl = ttl return r } func (r *Request) WithMaxRetries(maxRetries int) *Request { r.MaxRetries = &maxRetries return r } func (r *Request) WithCooldown(cooldown time.Duration) *Request { r.Cooldown = &cooldown return r } func (r *Request) WithIdempotencyKey(key string) *Request { normalized := strings.TrimSpace(key) if normalized == "" { r.IdempotencyKey = nil return r } r.IdempotencyKey = &normalized return r }