package service import ( "github.com/rs/zerolog" "go-humas-be/app/database/entity" requestPpidApproval "go-humas-be/app/module/ppid_data_approval_histories/request" ppidDataCategoriesRepository "go-humas-be/app/module/ppid_data_categories/repository" ppidDataFilesRepository "go-humas-be/app/module/ppid_data_files/repository" "go-humas-be/app/module/ppid_datas/mapper" "go-humas-be/app/module/ppid_datas/repository" "go-humas-be/app/module/ppid_datas/request" "go-humas-be/app/module/ppid_datas/response" userLevelsRepository "go-humas-be/app/module/user_levels/repository" userRoleLevelDetailsRepository "go-humas-be/app/module/user_role_level_details/repository" usersRepository "go-humas-be/app/module/users/repository" "go-humas-be/utils/paginator" utilSvc "go-humas-be/utils/service" "strconv" "strings" "time" ) // PpidDatasService type ppidDatasService struct { Repo repository.PpidDatasRepository PpidDataCategoriesRepo ppidDataCategoriesRepository.PpidDataCategoriesRepository PpidDataFilesRepo ppidDataFilesRepository.PpidDataFilesRepository UsersRepo usersRepository.UsersRepository UserLevelsRepo userLevelsRepository.UserLevelsRepository userRoleLevelDetailsRepo userRoleLevelDetailsRepository.UserRoleLevelDetailsRepository Log zerolog.Logger } // PpidDatasService define interface of IPpidDatasService type PpidDatasService interface { All(req request.PpidDatasQueryRequest, authToken *string) (ppidDatas []*response.PpidDatasResponse, paging paginator.Pagination, err error) Show(id string) (ppidDatas *response.PpidDatasResponse, err error) Save(req request.PpidDatasCreateRequest, authToken string) (ppidDatas *entity.PpidDatas, err error) Update(id uint, req request.PpidDatasUpdateRequest) (err error) UpdateApprovalStatus(req requestPpidApproval.PpidDataApprovalHistoriesCreateRequest, authToken string) (err error) UpdatePosition(req []request.PpidDatasUpdatePositionRequest) (err error) Delete(id uint) error } // NewPpidDatasService init PpidDatasService func NewPpidDatasService( repo repository.PpidDatasRepository, ppidDataCategoriesRepo ppidDataCategoriesRepository.PpidDataCategoriesRepository, ppidDataFilesRepo ppidDataFilesRepository.PpidDataFilesRepository, usersRepo usersRepository.UsersRepository, userLevelsRepo userLevelsRepository.UserLevelsRepository, userRoleLevelDetailsRepo userRoleLevelDetailsRepository.UserRoleLevelDetailsRepository, log zerolog.Logger, ) PpidDatasService { return &ppidDatasService{ Repo: repo, PpidDataCategoriesRepo: ppidDataCategoriesRepo, PpidDataFilesRepo: ppidDataFilesRepo, UsersRepo: usersRepo, UserLevelsRepo: userLevelsRepo, userRoleLevelDetailsRepo: userRoleLevelDetailsRepo, Log: log, } } // All implement interface of PpidDatasService func (_i *ppidDatasService) All(req request.PpidDatasQueryRequest, authToken *string) (ppidDatass []*response.PpidDatasResponse, paging paginator.Pagination, err error) { var user *entity.Users if authToken != nil && *authToken != "" { user = utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, *authToken) req.UserId = &user.ID req.UserRoleId = &user.UserRoleId req.UserLevelId = &user.UserLevelId } results, paging, err := _i.Repo.GetAll(req) if err != nil { return } for _, result := range results { ppidDatass = append(ppidDatass, mapper.PpidDatasResponseMapper(_i.Log, _i.PpidDataCategoriesRepo, _i.PpidDataFilesRepo, _i.UsersRepo, result)) } return } func (_i *ppidDatasService) Show(id string) (ppidDatas *response.PpidDatasResponse, err error) { var result *entity.PpidDatas if utilSvc.IsNumeric(id) { idInt, _ := strconv.Atoi(id) result, err = _i.Repo.FindOne(uint(idInt)) if err != nil { return nil, err } } else { result, err = _i.Repo.FindOneUsingSlug(id) if err != nil { return nil, err } } return mapper.PpidDatasResponseMapper(_i.Log, _i.PpidDataCategoriesRepo, _i.PpidDataFilesRepo, _i.UsersRepo, result), nil } func (_i *ppidDatasService) Save(req request.PpidDatasCreateRequest, authToken string) (ppidDatas *entity.PpidDatas, err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) newReq.CreatedById = &createdBy.ID newReq.LevelGroupId = &createdBy.UserLevelId userLevels, err := _i.UserLevelsRepo.FindOne(uint(createdBy.UserLevelId)) if err != nil { return nil, err } newReq.Group = userLevels.Group lastPpidData, _ := _i.Repo.FindOneLastPosition() lastPosition := lastPpidData.Position *lastPosition += 1 newReq.Position = lastPosition return _i.Repo.Create(newReq) } func (_i *ppidDatasService) Update(id uint, req request.PpidDatasUpdateRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") return _i.Repo.Update(id, req.ToEntity()) } func (_i *ppidDatasService) UpdatePosition(req []request.PpidDatasUpdatePositionRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") var entityReq []*entity.PpidDatas for _, reqItem := range req { entityReq = append(entityReq, reqItem.ToEntity()) } return _i.Repo.UpdateAll(entityReq) } func (_i *ppidDatasService) UpdateApprovalStatus(req requestPpidApproval.PpidDataApprovalHistoriesCreateRequest, authToken string) (err error) { _i.Log.Info().Interface("data", req).Msg("") ppidData, err := _i.Repo.FindOne(req.PpidDataId) if err != nil { return err } if req.ApprovalStatusId == 1 { ppidData.NeedApprovalFromUserRole = nil ppidData.NeedApprovalFromUserLevel = nil ppidData.BackApprovalToUserRole = nil ppidData.BackApprovalToUserLevel = nil } approvalBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) if approvalBy != nil { approvalByUserLevel, _ := _i.UserLevelsRepo.FindOne(uint(approvalBy.UserLevelId)) approvalByParentLevel, _ := _i.UserLevelsRepo.FindOne(uint(approvalByUserLevel.ParentLevelId)) _i.Log.Info().Interface("== findUserLevel ==", approvalByUserLevel).Msg("") _i.Log.Info().Interface("== findUserParentLevel ==", approvalByParentLevel).Msg("") if approvalByUserLevel != nil { ppidData.ApprovalStatusId = req.ApprovalStatusId if req.ApprovalStatusId == 1 { if approvalByUserLevel.LevelNumber == 1 { isPublish := true publishLevel := 1 timeNow := time.Now() ppidData.IsPublish = &isPublish ppidData.PublishLevel = &publishLevel ppidData.PublishedAt = &timeNow ppidData.ApprovalStatusId = req.ApprovalStatusId ppidData.NeedApprovalFromUserRole = nil ppidData.NeedApprovalFromUserLevel = nil } else if approvalByUserLevel.LevelNumber > 1 { isPublish := true publishLevel := 2 timeNow := time.Now() ppidData.IsPublish = &isPublish ppidData.PublishLevel = &publishLevel ppidData.PublishedAt = &timeNow needApprovalFromUserLevel := strconv.FormatUint(uint64(approvalByParentLevel.ID), 10) ppidData.NeedApprovalFromUserLevel = &needApprovalFromUserLevel findUserRoles, _ := _i.userRoleLevelDetailsRepo.FindByUserLevels(approvalByParentLevel.ID) var needApprovalFromUserRole []string for _, role := range findUserRoles { roleId := strconv.FormatUint(uint64(role.UserRoleId), 10) needApprovalFromUserRole = append(needApprovalFromUserRole, roleId) } needApprovalFromUserRoleStr := strings.Join(needApprovalFromUserRole, ":") *ppidData.NeedApprovalFromUserRole = ":" + needApprovalFromUserRoleStr + ":" } } else if req.ApprovalStatusId == 2 { createdBy, _ := _i.UsersRepo.FindOne(*ppidData.CreatedById) if createdBy != nil { backApprovalFromUserRole := strconv.FormatUint(uint64(createdBy.UserRoleId), 10) ppidData.BackApprovalToUserRole = &backApprovalFromUserRole needApprovalFromUserLevel := strconv.FormatUint(uint64(createdBy.UserLevelId), 10) ppidData.BackApprovalToUserLevel = &needApprovalFromUserLevel } } else { isPublish := false ppidData.IsPublish = &isPublish ppidData.PublishLevel = nil ppidData.PublishedAt = nil ppidData.ApprovalStatusId = req.ApprovalStatusId ppidData.NeedApprovalFromUserRole = nil ppidData.NeedApprovalFromUserLevel = nil } } } return _i.Repo.Update(req.PpidDataId, ppidData) } func (_i *ppidDatasService) Delete(id uint) error { result, err := _i.Repo.FindOne(id) if err != nil { return err } isActive := false result.IsActive = &isActive return _i.Repo.Update(id, result) }