Yimaru-BackEnd/internal/domain/team_invitation.go
Yared Yemane 31bd1e3814 Add team member email invitations for admin panel onboarding
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>
2026-05-22 03:43:00 -07:00

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"`
}