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 } const ( TeamInvitePlaceholderFirstName = "Pending" TeamInvitePlaceholderLastName = "Invite" ) func IsTeamInvitePlaceholderProfile(firstName, lastName string) bool { return firstName == TeamInvitePlaceholderFirstName && lastName == TeamInvitePlaceholderLastName } // InviteTeamMemberReq only requires email and role; profile fields are collected on accept. type InviteTeamMemberReq struct { Email string `json:"email" validate:"required,email"` TeamRole string `json:"team_role" validate:"required"` } type AcceptTeamInvitationReq struct { Token string `json:"token" validate:"required"` Password string `json:"password" validate:"required,min=8"` FirstName string `json:"first_name" validate:"required"` LastName string `json:"last_name" validate:"required"` PhoneNumber string `json:"phone_number"` Department string `json:"department"` JobTitle string `json:"job_title"` EmploymentType string `json:"employment_type"` HireDate string `json:"hire_date"` // YYYY-MM-DD ProfilePictureURL string `json:"profile_picture_url"` Bio string `json:"bio"` WorkPhone string `json:"work_phone"` EmergencyContact string `json:"emergency_contact"` } type VerifyTeamInvitationRes struct { Valid bool `json:"valid"` Email string `json:"email,omitempty"` TeamRole string `json:"team_role,omitempty"` NeedsProfileSetup bool `json:"needs_profile_setup,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"` }