narasiahli-be/app/module/users/service/user-expert.service.go

172 lines
4.5 KiB
Go

package service
import (
"errors"
"narasi-ahli-be/app/database/entity/users"
eduMapper "narasi-ahli-be/app/module/education_history/mapper"
eduRepo "narasi-ahli-be/app/module/education_history/repository"
eduReq "narasi-ahli-be/app/module/education_history/request"
researchMapper "narasi-ahli-be/app/module/research_journals/mapper"
researchRepo "narasi-ahli-be/app/module/research_journals/repository"
researchReq "narasi-ahli-be/app/module/research_journals/request"
userRepo "narasi-ahli-be/app/module/users/repository"
"narasi-ahli-be/app/module/users/request"
"narasi-ahli-be/app/module/users/response"
workMapper "narasi-ahli-be/app/module/work_history/mapper"
workRepo "narasi-ahli-be/app/module/work_history/repository"
workReq "narasi-ahli-be/app/module/work_history/request"
"narasi-ahli-be/utils/paginator"
"github.com/rs/zerolog"
)
type UserExpertService interface {
All(req request.UserExpertQueryRequest) ([]*response.UserExpertResponse, error)
Show(id uint) (*response.UserExpertResponse, error)
}
type userExpertService struct {
UserRepo userRepo.UserExpertRepository
WorkRepo workRepo.WorkHistoryRepository
EduRepo eduRepo.EducationHistoryRepository
ResearchRepo researchRepo.ResearchJournalsRepository
Log zerolog.Logger
}
func NewUserExpertService(
userRepo userRepo.UserExpertRepository,
workRepo workRepo.WorkHistoryRepository,
eduRepo eduRepo.EducationHistoryRepository,
researchRepo researchRepo.ResearchJournalsRepository,
log zerolog.Logger,
) UserExpertService {
return &userExpertService{
UserRepo: userRepo,
WorkRepo: workRepo,
EduRepo: eduRepo,
ResearchRepo: researchRepo,
Log: log,
}
}
func (s *userExpertService) All(
req request.UserExpertQueryRequest,
) ([]*response.UserExpertResponse, error) {
var users []*users.Users
var err error
if s.UserRepo == nil {
s.Log.Error().Msg("UserRepo IS NIL")
return nil, errors.New("internal server error")
}
// 🔥 pakai filter jika ada
users, err = s.UserRepo.GetExperts(req)
if err != nil {
return nil, err
}
var results []*response.UserExpertResponse
workReq := workReq.WorkHistoryQueryRequest{
Pagination: &paginator.Pagination{},
}
eduReq := eduReq.EducationHistoryQueryRequest{
Pagination: &paginator.Pagination{},
}
researchReq := researchReq.ResearchJournalsQueryRequest{
Pagination: &paginator.Pagination{},
}
for _, user := range users {
works, _, _ := s.WorkRepo.GetAll(user.ID, workReq)
educations, _, _ := s.EduRepo.GetAll(user.ID, eduReq)
researches, _, _ := s.ResearchRepo.GetAll(user.ID, researchReq)
res := &response.UserExpertResponse{
ID: user.ID,
Username: user.Username,
Email: user.Email,
Fullname: user.Fullname,
Phone: user.PhoneNumber,
LastJob: user.LastJobTitle,
IsActive: user.IsActive,
CreatedAt: user.CreatedAt,
}
for _, w := range works {
res.WorkHistories = append(
res.WorkHistories,
workMapper.WorkHistoryResponseMapper(w),
)
}
for _, e := range educations {
res.EducationHistories = append(
res.EducationHistories,
eduMapper.EducationHistoryResponseMapper(e),
)
}
for _, r := range researches {
res.ResearchJournals = append(
res.ResearchJournals,
researchMapper.ResearchJournalsResponseMapper(r),
)
}
results = append(results, res)
}
return results, nil
}
func (s *userExpertService) Show(id uint) (*response.UserExpertResponse, error) {
user, err := s.UserRepo.FindExpertByID(id)
if err != nil {
return nil, errors.New("expert not found")
}
req := workReq.WorkHistoryQueryRequest{}
researchReq := researchReq.ResearchJournalsQueryRequest{}
eduReq := eduReq.EducationHistoryQueryRequest{}
works, _, _ := s.WorkRepo.GetAll(id,req)
educations, _, _ := s.EduRepo.GetAll(id, eduReq)
researches, _, _ := s.ResearchRepo.GetAll(id, researchReq)
res := &response.UserExpertResponse{
ID: user.ID,
Username: user.Username,
Email: user.Email,
Fullname: user.Fullname,
Phone: user.PhoneNumber,
LastJob: user.LastJobTitle,
IsActive: user.IsActive,
CreatedAt: user.CreatedAt,
}
for _, w := range works {
res.WorkHistories = append(res.WorkHistories, workMapper.WorkHistoryResponseMapper(w))
}
for _, e := range educations {
res.EducationHistories = append(res.EducationHistories, eduMapper.EducationHistoryResponseMapper(e))
}
for _, r := range researches {
res.ResearchJournals = append(res.ResearchJournals, researchMapper.ResearchJournalsResponseMapper(r))
}
return res, nil
}