Introduces invite, verify, accept, resend, and revoke flows using team_members and invitation tokens, sends the branded invitation template, and requires account activation before team login. Co-authored-by: Cursor <cursoragent@cursor.com>
80 lines
2.5 KiB
Go
80 lines
2.5 KiB
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
ErrTeamInvitationNotFound = errors.New("team invitation not found")
|
|
ErrTeamInvitationExpired = errors.New("team invitation has expired")
|
|
ErrTeamInvitationAlreadyUsed = errors.New("team invitation has already been accepted")
|
|
ErrTeamInvitationRevoked = errors.New("team invitation has been revoked")
|
|
ErrTeamMemberPendingInvitation = errors.New("team member must accept their invitation before signing in")
|
|
ErrTeamInviteBaseURLNotConfigured = errors.New("team invite base URL is not configured")
|
|
)
|
|
|
|
type TeamInvitationStatus string
|
|
|
|
const (
|
|
TeamInvitationStatusPending TeamInvitationStatus = "pending"
|
|
TeamInvitationStatusAccepted TeamInvitationStatus = "accepted"
|
|
TeamInvitationStatusExpired TeamInvitationStatus = "expired"
|
|
TeamInvitationStatusRevoked TeamInvitationStatus = "revoked"
|
|
)
|
|
|
|
type TeamInvitation struct {
|
|
ID int64
|
|
TeamMemberID int64
|
|
Token string
|
|
Status TeamInvitationStatus
|
|
ExpiresAt time.Time
|
|
InvitedBy *int64
|
|
AcceptedAt *time.Time
|
|
CreatedAt time.Time
|
|
UpdatedAt *time.Time
|
|
}
|
|
|
|
type TeamInvitationWithMember struct {
|
|
TeamInvitation
|
|
Email string
|
|
FirstName string
|
|
LastName string
|
|
TeamRole TeamRole
|
|
}
|
|
|
|
type InviteTeamMemberReq struct {
|
|
FirstName string `json:"first_name" validate:"required"`
|
|
LastName string `json:"last_name" validate:"required"`
|
|
Email string `json:"email" validate:"required,email"`
|
|
PhoneNumber string `json:"phone_number"`
|
|
TeamRole string `json:"team_role" validate:"required"`
|
|
Department string `json:"department"`
|
|
JobTitle string `json:"job_title"`
|
|
EmploymentType string `json:"employment_type"`
|
|
HireDate string `json:"hire_date"`
|
|
Permissions []string `json:"permissions"`
|
|
}
|
|
|
|
type AcceptTeamInvitationReq struct {
|
|
Token string `json:"token" validate:"required"`
|
|
Password string `json:"password" validate:"required,min=8"`
|
|
}
|
|
|
|
type VerifyTeamInvitationRes struct {
|
|
Valid bool `json:"valid"`
|
|
Email string `json:"email,omitempty"`
|
|
FirstName string `json:"first_name,omitempty"`
|
|
LastName string `json:"last_name,omitempty"`
|
|
TeamRole string `json:"team_role,omitempty"`
|
|
ExpiresAt time.Time `json:"expires_at,omitempty"`
|
|
Status string `json:"status,omitempty"`
|
|
}
|
|
|
|
type InviteTeamMemberRes struct {
|
|
InvitationID int64 `json:"invitation_id"`
|
|
TeamMemberID int64 `json:"team_member_id"`
|
|
Email string `json:"email"`
|
|
ExpiresAt string `json:"expires_at"`
|
|
}
|