Yimaru-BackEnd/internal/domain/team.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"`
}