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 }