package net.gepafin.tendermanagement.dao; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.FaqEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.model.response.FaqResponseBean; import net.gepafin.tendermanagement.repositories.FaqRepository; import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.LookUpDataService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @Component public class FaqDao { @Autowired private FaqRepository faqRepository; @Autowired private CallService callService; @Autowired private LookUpDataService lookUpDataService; @Autowired private Validator validator; @Autowired private CompanyService companyService; @Autowired private UserWithCompanyRepository userWithCompanyRepository; @Autowired HttpServletRequest request; @Autowired LoggingUtil loggingUtil; public FaqResponseBean createFaq(FaqReq faqRequest, UserEntity userEntity, Long callId, Long companyId) { CallEntity callEntity = callService.validateCall(callId); FaqEntity entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity, LookUpDataTypeEnum.FAQ); FaqEntity oldFaqEntity = Utils.getClonedEntityForData(entity); if (validator.checkIsBeneficiary() && companyId == null) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY)); } UserWithCompanyEntity userWithCompanyEntity=null; if(companyId!=null) { userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId); companyService.validateCompany(userWithCompanyEntity.getCompanyId()); entity.setCompanyId(userWithCompanyEntity.getCompanyId()); } entity.setUserWithCompany(userWithCompanyEntity); faqRepository.save(entity); if (entity.getCompanyId() != null) { /** This code is responsible for adding a version history log for the "Create FAQ" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldFaqEntity).newData(entity).build()); } return convertToFaqResponseBean(entity); } public FaqResponseBean getFaqById(Long id) { return convertToFaqResponseBean(validateFaq(id)); } public FaqResponseBean updateFaq(Long id, FaqReq faqRequest, UserEntity userEntity) { FaqEntity entity = validateFaq(id); faqRequest.setId(entity.getId()); createOrUpdateFaqEntity(faqRequest, entity.getCall(), userEntity, LookUpDataTypeEnum.FAQ); return convertToFaqResponseBean(entity); } public void deleteFaq(Long id) { FaqEntity faqEntity = validateFaq(id); FaqEntity oldFaqEntity = Utils.getClonedEntityForData(faqEntity); faqEntity.setIsDeleted(Boolean.TRUE); faqRepository.save(faqEntity); /** This code is responsible for adding a version history log for the "soft delete faq" operation **/ loggingUtil.addVersionHistory( VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldFaqEntity).newData(faqEntity).build()); } public FaqEntity validateFaq(Long id) { return faqRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); } public List getFaqByCallId(Long callId) { callService.validateCall(callId); return faqRepository.findByCallIdAndIsDeletedFalse(callId).stream().map(this::convertToFaqResponseBean) .toList(); } public FaqEntity createOrUpdateFaqEntity(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity, LookUpDataTypeEnum type) { FaqEntity faqEntity = null; FaqEntity oldFaqEntity = null; VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT; if (isExistingFaq(faqReq)) { faqEntity = faqRepository.findByIdAndCallIdAndIsDeletedFalse(faqReq.getId(), callEntity.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); oldFaqEntity = Utils.getClonedEntityForData(faqEntity); actionType = VersionActionTypeEnum.UPDATE; } else { if (Boolean.FALSE.equals(userEntity.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()))) { lookUpDataService.getOrCreateLookUpDataEntity(faqReq, type); } faqEntity = new FaqEntity(); faqEntity.setCall(callEntity); faqEntity.setUser(userEntity); faqEntity.setIsVisible(false); faqEntity.setIsDeleted(false); actionType = VersionActionTypeEnum.INSERT; } if (faqReq.getResponse() != null && (faqEntity.getResponse() == null || Boolean.FALSE.equals(faqReq.getResponse().equals(faqEntity.getResponse())))) { faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); } setIfUpdated(faqEntity::getTitle, faqEntity::setTitle, faqReq.getTitle()); setIfUpdated(faqEntity::getValue, faqEntity::setValue, faqReq.getValue()); setIfUpdated(faqEntity::getResponse, faqEntity::setResponse, faqReq.getResponse()); setIfUpdated(faqEntity::getIsVisible, faqEntity::setIsVisible, faqReq.getIsVisible()); faqEntity = faqRepository.save(faqEntity); /** This code is responsible for adding a version history log for the "create or update faq" operation **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldFaqEntity).newData(faqEntity).build()); return faqEntity; } private boolean isExistingFaq(FaqReq faqReq) { return faqReq.getId() != null && faqReq.getId() > 0; } public FaqResponseBean convertToFaqResponseBean(FaqEntity entity) { FaqResponseBean responseBean = new FaqResponseBean(); responseBean.setId(entity.getId()); responseBean.setUserId(entity.getUser().getId()); responseBean.setTitle(entity.getTitle()); responseBean.setValue(entity.getValue()); responseBean.setResponse(entity.getResponse()); responseBean.setResponseDate(entity.getResponseDate()); responseBean.setIsVisible(entity.getIsVisible()); responseBean.setCreatedDate(entity.getCreatedDate()); responseBean.setUpdatedDate(entity.getUpdatedDate()); return responseBean; } }