211 lines
5.8 KiB
Go
211 lines
5.8 KiB
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
ErrTeamMemberNotFound = errors.New("team member not found")
|
|
ErrTeamMemberEmailExists = errors.New("team member email already exists")
|
|
ErrInvalidTeamRole = errors.New("invalid team role")
|
|
ErrInvalidTeamMemberStatus = errors.New("invalid team member status")
|
|
ErrInvalidEmploymentType = errors.New("invalid employment type")
|
|
ErrTeamMemberEmailNotVerified = errors.New("team member email not verified")
|
|
)
|
|
|
|
type TeamRole string
|
|
|
|
const (
|
|
TeamRoleSuperAdmin TeamRole = "super_admin"
|
|
TeamRoleAdmin TeamRole = "admin"
|
|
TeamRoleContentManager TeamRole = "content_manager"
|
|
TeamRoleSupportAgent TeamRole = "support_agent"
|
|
TeamRoleInstructor TeamRole = "instructor"
|
|
TeamRoleFinance TeamRole = "finance"
|
|
TeamRoleHR TeamRole = "hr"
|
|
TeamRoleAnalyst TeamRole = "analyst"
|
|
)
|
|
|
|
func (r TeamRole) IsValid() bool {
|
|
switch r {
|
|
case TeamRoleSuperAdmin, TeamRoleAdmin, TeamRoleContentManager,
|
|
TeamRoleSupportAgent, TeamRoleInstructor, TeamRoleFinance,
|
|
TeamRoleHR, TeamRoleAnalyst:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func (r TeamRole) String() string {
|
|
return string(r)
|
|
}
|
|
|
|
type TeamMemberStatus string
|
|
|
|
const (
|
|
TeamMemberStatusActive TeamMemberStatus = "active"
|
|
TeamMemberStatusInactive TeamMemberStatus = "inactive"
|
|
TeamMemberStatusSuspended TeamMemberStatus = "suspended"
|
|
TeamMemberStatusTerminated TeamMemberStatus = "terminated"
|
|
)
|
|
|
|
func (s TeamMemberStatus) IsValid() bool {
|
|
switch s {
|
|
case TeamMemberStatusActive, TeamMemberStatusInactive,
|
|
TeamMemberStatusSuspended, TeamMemberStatusTerminated:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
type EmploymentType string
|
|
|
|
const (
|
|
EmploymentTypeFullTime EmploymentType = "full_time"
|
|
EmploymentTypePartTime EmploymentType = "part_time"
|
|
EmploymentTypeContract EmploymentType = "contract"
|
|
EmploymentTypeIntern EmploymentType = "intern"
|
|
)
|
|
|
|
func (e EmploymentType) IsValid() bool {
|
|
switch e {
|
|
case EmploymentTypeFullTime, EmploymentTypePartTime,
|
|
EmploymentTypeContract, EmploymentTypeIntern:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
type TeamMember struct {
|
|
ID int64
|
|
FirstName string
|
|
LastName string
|
|
Email string
|
|
PhoneNumber string
|
|
Password []byte
|
|
|
|
TeamRole TeamRole
|
|
Department string
|
|
JobTitle string
|
|
EmploymentType EmploymentType
|
|
HireDate *time.Time
|
|
|
|
ProfilePictureURL string
|
|
Bio string
|
|
WorkPhone string
|
|
EmergencyContact string
|
|
|
|
Status TeamMemberStatus
|
|
EmailVerified bool
|
|
Permissions []string
|
|
|
|
LastLogin *time.Time
|
|
CreatedBy *int64
|
|
UpdatedBy *int64
|
|
|
|
CreatedAt time.Time
|
|
UpdatedAt *time.Time
|
|
}
|
|
|
|
type TeamMemberResponse struct {
|
|
ID int64 `json:"id"`
|
|
FirstName string `json:"first_name"`
|
|
LastName string `json:"last_name"`
|
|
Email string `json:"email"`
|
|
PhoneNumber string `json:"phone_number,omitempty"`
|
|
|
|
TeamRole TeamRole `json:"team_role"`
|
|
Department string `json:"department,omitempty"`
|
|
JobTitle string `json:"job_title,omitempty"`
|
|
EmploymentType EmploymentType `json:"employment_type,omitempty"`
|
|
HireDate string `json:"hire_date,omitempty"`
|
|
|
|
ProfilePictureURL string `json:"profile_picture_url,omitempty"`
|
|
Bio string `json:"bio,omitempty"`
|
|
WorkPhone string `json:"work_phone,omitempty"`
|
|
|
|
Status TeamMemberStatus `json:"status"`
|
|
EmailVerified bool `json:"email_verified"`
|
|
Permissions []string `json:"permissions,omitempty"`
|
|
|
|
LastLogin *time.Time `json:"last_login,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
}
|
|
|
|
type CreateTeamMemberReq 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"`
|
|
Password string `json:"password" validate:"required,min=8"`
|
|
|
|
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"` // YYYY-MM-DD
|
|
|
|
ProfilePictureURL string `json:"profile_picture_url"`
|
|
Bio string `json:"bio"`
|
|
WorkPhone string `json:"work_phone"`
|
|
EmergencyContact string `json:"emergency_contact"`
|
|
|
|
Permissions []string `json:"permissions"`
|
|
}
|
|
|
|
type UpdateTeamMemberReq struct {
|
|
TeamMemberID int64 `json:"-"`
|
|
UpdatedBy int64 `json:"-"`
|
|
|
|
FirstName string `json:"first_name"`
|
|
LastName string `json:"last_name"`
|
|
PhoneNumber string `json:"phone_number"`
|
|
|
|
TeamRole string `json:"team_role"`
|
|
Department string `json:"department"`
|
|
JobTitle string `json:"job_title"`
|
|
EmploymentType string `json:"employment_type"`
|
|
HireDate string `json:"hire_date"`
|
|
|
|
ProfilePictureURL string `json:"profile_picture_url"`
|
|
Bio string `json:"bio"`
|
|
WorkPhone string `json:"work_phone"`
|
|
EmergencyContact string `json:"emergency_contact"`
|
|
|
|
Permissions []string `json:"permissions"`
|
|
}
|
|
|
|
type UpdateTeamMemberStatusReq struct {
|
|
TeamMemberID int64 `json:"-"`
|
|
Status string `json:"status" validate:"required"`
|
|
UpdatedBy int64 `json:"-"`
|
|
}
|
|
|
|
type TeamMemberFilter struct {
|
|
TeamRole *string
|
|
Department *string
|
|
Status *string
|
|
Search string
|
|
|
|
Page int64
|
|
PageSize int64
|
|
}
|
|
|
|
type TeamMemberStats struct {
|
|
ActiveCount int64 `json:"active_count"`
|
|
InactiveCount int64 `json:"inactive_count"`
|
|
SuspendedCount int64 `json:"suspended_count"`
|
|
TerminatedCount int64 `json:"terminated_count"`
|
|
TotalCount int64 `json:"total_count"`
|
|
}
|
|
|
|
type TeamMemberLoginReq struct {
|
|
Email string `json:"email" validate:"required,email"`
|
|
Password string `json:"password" validate:"required"`
|
|
}
|