95 lines
3.0 KiB
Go
95 lines
3.0 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
|
|
}
|
|
|
|
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"`
|
|
}
|