package domain import ( "errors" "time" "github.com/google/uuid" ) type TokenStatus string const ( TokenStatusActive TokenStatus = "active" TokenStatusUsed TokenStatus = "used" TokenStatusRevoked TokenStatus = "revoked" TokenStatusExpired TokenStatus = "expired" ) type Token struct { ID uuid.UUID `json:"id"` GuestID uuid.UUID `json:"guest_id"` TokenHash string `json:"-"` ExpiresAt time.Time `json:"expires_at"` Status TokenStatus `json:"status"` UsedAt *time.Time `json:"used_at,omitempty"` CreatedAt time.Time `json:"created_at"` } func (t *Token) IsValid(now time.Time) error { switch t.Status { case TokenStatusUsed: return ErrTokenAlreadyUsed case TokenStatusRevoked: return ErrTokenRevoked case TokenStatusExpired: return ErrTokenExpired } if now.After(t.ExpiresAt) { return ErrTokenExpired } return nil } var ( ErrTokenNotFound = errors.New("token not found") ErrTokenExpired = errors.New("token expired") ErrTokenRevoked = errors.New("token revoked") ErrTokenAlreadyUsed = errors.New("token already used") )