From 4412e447fb9b6a62141dcf7de7bc3776536477c5 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 17 Oct 2024 16:01:38 +0530 Subject: [PATCH 1/4] Done ticket GEPAFINBE-59 --- .../gepafin/tendermanagement/dao/CallDao.java | 17 +- .../dao/EvaluationCriteriaDao.java | 25 +- .../gepafin/tendermanagement/dao/FormDao.java | 234 ++++++++++++------ .../entities/CriteriaFormFieldEntity.java | 20 ++ .../model/request/ContentRequestBean.java | 2 + .../model/response/ContentResponseBean.java | 2 + .../CriteriaFormFieldRepository.java | 17 ++ .../service/EvaluationCriteriaService.java | 3 + .../impl/EvaluationCriteriaServiceImpl.java | 6 + .../web/rest/api/EvaluationCriteriaApi.java | 2 +- .../impl/EvaluationCriteriaApiController.java | 6 +- .../db/changelog/db.changelog-1.0.0.xml | 37 +++ 12 files changed, 281 insertions(+), 90 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 13101423..1a5e78da 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.dao; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -23,10 +22,6 @@ import net.gepafin.tendermanagement.util.Utils; import org.h2.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -34,6 +29,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; +import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.entities.FaqEntity; @@ -52,6 +48,7 @@ import net.gepafin.tendermanagement.model.request.LookUpDataReq; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.CallTargetAudienceChecklistRepository; +import net.gepafin.tendermanagement.repositories.CriteriaFormFieldRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; import net.gepafin.tendermanagement.repositories.FaqRepository; @@ -93,14 +90,21 @@ public class CallDao { @Autowired private FaqService faqService; + @Autowired private FlowDao flowDao; + @Autowired private FormDao formDao; + @Value("${aws.s3.url.folder}") private String s3Folder; + @Autowired private AmazonS3Service amazonS3Service; + + @Autowired + private CriteriaFormFieldRepository criteriaFormFieldRepository; public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { UserEntity userEntity = userService.validateUser(userId); @@ -208,6 +212,8 @@ public class CallDao { private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) { evaluationCriteriaEntity.setIsDeleted(true); evaluationCriteriaRepository.save(evaluationCriteriaEntity); + List list = criteriaFormFieldRepository.findByEvaluationCriteriaId(evaluationCriteriaEntity.getId()); + criteriaFormFieldRepository.deleteAll(list); } private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, @@ -255,6 +261,7 @@ public class CallDao { private void softDeleteDocument(DocumentEntity documentEntity) { documentEntity.setIsDeleted(true); documentRepository.save(documentEntity); + } private DocumentEntity convertToDocumentEntity(DocumentReq documentReq,Long sourceId) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java index f747d38f..fbb0a7ba 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -3,17 +3,21 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.repositories.CriteriaFormFieldRepository; import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.LookUpDataService; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; + +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Component; @Component @@ -27,6 +31,9 @@ public class EvaluationCriteriaDao { @Autowired private LookUpDataService lookUpDataService; + + @Autowired + private CriteriaFormFieldRepository criteriaFormFieldRepository; public EvaluationCriteriaResponseBean createEvaluationCriteria( EvaluationCriteriaRequest evaluationCriteriaRequest) { @@ -54,6 +61,12 @@ public class EvaluationCriteriaDao { .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); } + + public EvaluationCriteriaEntity validateEvaluationCriteria(Long id) { + return evaluationCriteriaRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + } public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest request) { EvaluationCriteriaEntity entity = evaluationCriteriaRepository.findById(id) @@ -64,12 +77,12 @@ public class EvaluationCriteriaDao { } public void deleteEvaluationCriteria(Long id) { - try { evaluationCriteriaRepository.deleteById(id); - } catch (EmptyResultDataAccessException e) { - throw new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)); - } + EvaluationCriteriaEntity evaluationCriteriaEntity = validateEvaluationCriteria(id); + evaluationCriteriaEntity.setIsDeleted(Boolean.TRUE); + evaluationCriteriaRepository.save(evaluationCriteriaEntity); + List list = criteriaFormFieldRepository.findByEvaluationCriteriaId(evaluationCriteriaEntity.getId()); + criteriaFormFieldRepository.deleteAll(list); } private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean( diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 84c9d9b1..c13545c2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -6,9 +6,9 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean; -import net.gepafin.tendermanagement.model.response.VatNumberResponseBean; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.service.EvaluationCriteriaService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.util.Utils; @@ -22,9 +22,12 @@ import org.springframework.util.CollectionUtils; import java.text.MessageFormat; import java.time.LocalDateTime; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; @Component @@ -53,13 +56,19 @@ public class FormDao { @Autowired private CallRepository callRepository; + + @Autowired + private CriteriaFormFieldRepository criteriaFormFieldRepository; + + @Autowired + private EvaluationCriteriaService evaluationCriteriaService; public FormEntity saveFormEntity(FormEntity formEntity){ formEntity=formRepository.save(formEntity); return formEntity; } - - public FormEntity convertFormRequestToFormEntity(Long callId,FormRequest formRequest){ + + public FormEntity convertFormRequestToFormEntity(Long callId,FormRequest formRequest) { FormEntity formEntity=new FormEntity(); CallEntity callEntity=callService.getCallEntityById(callId); formEntity.setCall(callEntity); @@ -68,16 +77,29 @@ public class FormDao { formEntity=saveFormEntity(formEntity); return formEntity; } - public FormResponseBean convertFormEntityToFormResponseBean(FormEntity formEntity){ + public FormResponseBean convertFormEntityToFormResponseBean(FormEntity formEntity) { FormResponseBean formResponseBean=new FormResponseBean(); formResponseBean.setId(formEntity.getId()); - formResponseBean.setContent(Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class)); + formResponseBean.setContent(setContent(formEntity)); formResponseBean.setLabel(formEntity.getLabel()); formResponseBean.setCallId(formEntity.getCall().getId()); formResponseBean.setCallStatus(formEntity.getCall().getStatus()); return formResponseBean; } - public FormResponseBean createForm(Long callId,FormRequest formRequest){ + + private List setContent(FormEntity formEntity) { + List contentList = Utils.convertJsonStringToList(formEntity.getContent(), + ContentResponseBean.class); + contentList.forEach(data -> { + List criteriaIds = criteriaFormFieldRepository + .findByCallIdAndFormIdAndFormFieldId(formEntity.getCall().getId(), formEntity.getId(), data.getId()) + .stream().map(CriteriaFormFieldEntity::getEvaluationCriteriaId).toList(); + data.setCriteria(criteriaIds); + }); + return contentList; + } + + public FormResponseBean createForm(Long callId,FormRequest formRequest){ validateForm(formRequest); CallEntity callEntity=callService.validateCall(callId); List flowDataEntities=flowDataRepository.findByCallId(callId); @@ -90,80 +112,139 @@ public class FormDao { callRepository.save(callEntity); } FormEntity formEntity=convertFormRequestToFormEntity(callId,formRequest); + validateAndSaveCriteriaFormField(callEntity, formEntity, formRequest.getContent()); return convertFormEntityToFormResponseBean(formEntity); } - public void validateForm(FormRequest formRequest){ + + private void validateAndSaveCriteriaFormField(CallEntity callEntity, FormEntity formEntity, + List contentResponseBeans) { + + contentResponseBeans.forEach(content -> { + // Fetch existing records from the repository based on the call, form, and field ID + List existingCriteriaFields = criteriaFormFieldRepository + .findByCallIdAndFormIdAndFormFieldId(callEntity.getId(), formEntity.getId(), content.getId()); + + // Extract existing evaluation criteria IDs into a set for quick lookup + Set existingEvaluationCriteriaIds = existingCriteriaFields.stream() + .map(CriteriaFormFieldEntity::getEvaluationCriteriaId) + .collect(Collectors.toSet()); + + // Get the criteria list (handling null as an empty list for uniformity) + List criteriaList = Optional.ofNullable(content.getCriteria()).orElse(Collections.emptyList()); + + // Filter and create new entries for criteria that are not already present + criteriaList.stream() + .filter(criteriaId -> !existingEvaluationCriteriaIds.contains(criteriaId)) + .forEach(criteriaId -> createCriteriaFormField(callEntity, formEntity, content.getId(), criteriaId)); + + List toBeDeleted = existingCriteriaFields.stream() + .filter(criteriaFormField -> !criteriaList.contains(criteriaFormField.getEvaluationCriteriaId())) + .collect(Collectors.toList()); + + if (!toBeDeleted.isEmpty()) { + criteriaFormFieldRepository.deleteAll(toBeDeleted); + } + }); + } + + + private void createCriteriaFormField(CallEntity callEntity, FormEntity formEntity, + String formFieldId,Long evaluationCriteriaId) { + evaluationCriteriaService.validateEvaluationCriteria(evaluationCriteriaId); + CriteriaFormFieldEntity criteriaFormField = new CriteriaFormFieldEntity(); + criteriaFormField.setCallId(callEntity.getId()); + criteriaFormField.setFormId(formEntity.getId()); + criteriaFormField.setFormFieldId(formFieldId); + criteriaFormField.setEvaluationCriteriaId(evaluationCriteriaId); + criteriaFormFieldRepository.save(criteriaFormField); + + } + + public void validateForm(FormRequest formRequest){ if(formRequest.getContent()==null || formRequest.getLabel()==null ){ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM)); } } - public FormResponseBean updateForm(Long formId, FormRequest formRequest,Boolean forceDeleteFlow){ - ContentRequestBean contentRequestBean2=null; - String choosenField=null; - FormEntity formEntity = validateForm(formId); - callDao.validateUpdate(formEntity.getCall()); - List contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), ContentRequestBean.class); - for (ContentRequestBean contentRequestBean1 : contentRequestBean) { - FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndChoosenField(formEntity.getId(), contentRequestBean1.getId()); - if (flowDataEntity != null) { - choosenField = flowDataEntity.getChoosenField(); - if (Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))) { - contentRequestBean2 = contentRequestBean1; - break; - } - } - } - if (contentRequestBean2 != null) { - List settingRequestBeansDB = contentRequestBean2.getSettings(); - for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) { - if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) { - for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest.getSettings()) { - for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) { - if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) { - if (!settingRequestBeanRequest.getValue().equals(settingRequestBeanDB.getValue())) { - if (Boolean.TRUE.equals(forceDeleteFlow)) { - Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); - formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity = saveFormEntity(formEntity); - List flowDataEntities = flowDataRepository.findByCallId(formEntity.getCall().getId()); - List flowEdgesEntities = flowEdgesRepository.findByCallId(formEntity.getCall().getId()); - flowDataRepository.deleteAll(flowDataEntities); - flowEdgesRepository.deleteAll(flowEdgesEntities); - CallEntity callEntity = formEntity.getCall(); - callEntity.setInitialForm(null); - callEntity.setFinalForm(null); - callRepository.save(callEntity); - return convertFormEntityToFormResponseBean(formEntity); - } else { - throw new CustomValidationException( - Status.BAD_REQUEST, - Translator.toLocale(GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, choosenField) - ); - } - } - else { - Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); - formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity = saveFormEntity(formEntity); - return convertFormEntityToFormResponseBean(formEntity); - } - } - } - } - } - } - } - else { - Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); - formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity = saveFormEntity(formEntity); - return convertFormEntityToFormResponseBean(formEntity); - } - return convertFormEntityToFormResponseBean(formEntity); - } + + public FormResponseBean updateForm(Long formId, FormRequest formRequest, Boolean forceDeleteFlow) { + ContentRequestBean contentRequestBean2 = null; + String choosenField = null; + FormEntity formEntity = validateForm(formId); + callDao.validateUpdate(formEntity.getCall()); + List contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), + ContentRequestBean.class); + for (ContentRequestBean contentRequestBean1 : contentRequestBean) { + FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndChoosenField(formEntity.getId(), + contentRequestBean1.getId()); + if (flowDataEntity != null) { + choosenField = flowDataEntity.getChoosenField(); + if (Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))) { + contentRequestBean2 = contentRequestBean1; + break; + } + } + } + if (contentRequestBean2 != null) { + List settingRequestBeansDB = contentRequestBean2.getSettings(); + for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) { + if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) { + for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest + .getSettings()) { + for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) { + if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) { + if (!settingRequestBeanRequest.getValue() + .equals(settingRequestBeanDB.getValue())) { + if (Boolean.TRUE.equals(forceDeleteFlow)) { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, + formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, + setContentResponseBean(formRequest.getContent())); + formEntity.setUpdatedDate( + DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + List flowDataEntities = flowDataRepository + .findByCallId(formEntity.getCall().getId()); + List flowEdgesEntities = flowEdgesRepository + .findByCallId(formEntity.getCall().getId()); + flowDataRepository.deleteAll(flowDataEntities); + flowEdgesRepository.deleteAll(flowEdgesEntities); + CallEntity callEntity = formEntity.getCall(); + callEntity.setInitialForm(null); + callEntity.setFinalForm(null); + callRepository.save(callEntity); + return convertFormEntityToFormResponseBean(formEntity); + } else { + throw new CustomValidationException(Status.BAD_REQUEST, + Translator.toLocale( + GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, + choosenField)); + } + } else { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, + formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, + setContentResponseBean(formRequest.getContent())); + formEntity + .setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + return convertFormEntityToFormResponseBean(formEntity); + } + } + } + } + } + } + } else { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, + setContentResponseBean(formRequest.getContent())); + formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + validateAndSaveCriteriaFormField(formEntity.getCall(), formEntity, formRequest.getContent()); + return convertFormEntityToFormResponseBean(formEntity); + } + return convertFormEntityToFormResponseBean(formEntity); + } public FormEntity validateForm(Long formId) { FormEntity formEntity = formRepository.findById(formId) @@ -200,7 +281,10 @@ public class FormDao { return formResponseBeanList; } public String setContentResponseBean(List contentRequestBeans){ - return Utils.convertListToJsonString(contentRequestBeans); + String stringContentRequest = Utils.convertListToJsonString(contentRequestBeans); + List cloneContentRequestBeans = Utils.convertJsonStringToList(stringContentRequest, ContentRequestBean.class); + cloneContentRequestBeans.forEach(data->data.setCriteria(null)); + return Utils.convertListToJsonString(cloneContentRequestBeans); } public void validateFormField(List applicationFormFieldRequestList, ApplicationEntity applicationEntity, FormEntity formEntity) { diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java new file mode 100644 index 00000000..72876b92 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Table(name = "criteria_form_field") +@Data +public class CriteriaFormFieldEntity extends BaseEntity { + + private Long callId; + + private Long formId; + + private String formFieldId; + + private Long evaluationCriteriaId; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java index f0399ead..bd6fa7d7 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java @@ -13,6 +13,8 @@ public class ContentRequestBean { private String label; private List settings; private Map validators; + private List criteria; + private String dynamicData; private Integer dbId; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java index 6ee1367d..8fa685b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java @@ -13,5 +13,7 @@ public class ContentResponseBean { private String label; private List settings; private Map validators; + private List criteria; + private String dynamicData; private Integer dbId; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java new file mode 100644 index 00000000..88f67da8 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.repositories; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; + +@Repository +public interface CriteriaFormFieldRepository extends JpaRepository{ + + List findByCallIdAndFormIdAndFormFieldId(Long callId, Long formId, String formFieldId); + + List findByEvaluationCriteriaId(Long evaluationCriteriaId); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java b/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java index 3c1e2b85..5853b97a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; @@ -13,4 +14,6 @@ public interface EvaluationCriteriaService { public EvaluationCriteriaResponseBean updateEvaluationCriteria(HttpServletRequest request,Long id, EvaluationCriteriaRequest evaluationCriteriaRequest); public void deleteEvaluationCriteria(HttpServletRequest request,Long id); + + public EvaluationCriteriaEntity validateEvaluationCriteria(Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java index 2aef9e5f..f597dcfe 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.EvaluationCriteriaDao; +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; import net.gepafin.tendermanagement.service.EvaluationCriteriaService; @@ -33,4 +34,9 @@ public class EvaluationCriteriaServiceImpl implements EvaluationCriteriaService public void deleteEvaluationCriteria(HttpServletRequest request,Long id) { evaluationCriteriaDao.deleteEvaluationCriteria(id); } + + @Override + public EvaluationCriteriaEntity validateEvaluationCriteria(Long id) { + return evaluationCriteriaDao.validateEvaluationCriteria(id); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java index 4274cccb..df527940 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java @@ -72,7 +72,7 @@ public interface EvaluationCriteriaApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) }) @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, + ResponseEntity> deleteEvaluationCriteria(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable("id") Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java index 6c6286ae..37e8b7a6 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java @@ -57,10 +57,10 @@ public class EvaluationCriteriaApiController implements EvaluationCriteriaApi { } @Override - public ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, Long id) { + public ResponseEntity> deleteEvaluationCriteria(HttpServletRequest request, Long id) { service.deleteEvaluationCriteria(request,id); + return ResponseEntity.status(HttpStatus.OK) - .header("Message", Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_DELETED_SUCCESSFULLY)) - .build(); + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_DELETED_SUCCESSFULLY))); } } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 609f117c..14d2f3c0 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1101,4 +1101,41 @@ + + + + + + + + + + + + + + + + + + + + + From 07498ce1ef3507d6cacf48ffa30072656c1e2a19 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 17 Oct 2024 19:39:25 -0700 Subject: [PATCH 2/4] Updated SAML config --- .../tendermanagement/config/SamlConfig.java | 46 +++++++++++-------- .../config/SamlRequestFilter.java | 24 ++++++++++ .../config/SamlSuccessHandler.java | 28 +++++++++++ .../config/SecurityConfig.java | 31 ++++++------- 4 files changed, 94 insertions(+), 35 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/config/SamlRequestFilter.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java index c66e26f1..050c4167 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java @@ -41,6 +41,10 @@ import org.springframework.security.saml2.provider.service.web.DefaultRelyingPar import org.springframework.security.saml2.provider.service.web.RelyingPartyRegistrationResolver; import org.springframework.security.saml2.provider.service.web.authentication.OpenSaml4AuthenticationRequestResolver; import org.springframework.security.saml2.provider.service.web.authentication.Saml2AuthenticationRequestResolver; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.servlet.http.HttpServletRequest; @Configuration public class SamlConfig { @@ -123,28 +127,34 @@ public class SamlConfig { return authnRequest; } -@Bean -public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { - RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations); - OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver); + @Bean + public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { + RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations); + OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver); - authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { - // Set the required attributes - AuthnRequest authnRequest = context.getAuthnRequest(); - authnRequest.setID("_" + UUID.randomUUID().toString()); // Add a unique ID - authnRequest.setVersion(SAMLVersion.VERSION_20); // Ensure version is 2.0 - authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI); // HTTP-POST + authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { - // Set Authentication Context - authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext()); + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); + String hubId = (String) request.getAttribute("hubId"); - // Log the SAML AuthnRequest after setting context - String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); - logger.info("SAML AuthnRequest after setting context: " + samlRequest); - }); + logger.info("Hub id " + hubId); + + // Continue with normal AuthnRequest configuration + AuthnRequest authnRequest = context.getAuthnRequest(); + authnRequest.setID("_" + UUID.randomUUID().toString()+":"+hubId); + authnRequest.setVersion(SAMLVersion.VERSION_20); + authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI); + authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext()); + + + // Log the SAML AuthnRequest after setting context + String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); + logger.info("SAML AuthnRequest after setting context: " + samlRequest); + }); + + return authenticationRequestResolver; + } - return authenticationRequestResolver; -} private RequestedAuthnContext buildRequestedAuthnContext() { AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlRequestFilter.java b/src/main/java/net/gepafin/tendermanagement/config/SamlRequestFilter.java new file mode 100644 index 00000000..a7b3a664 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlRequestFilter.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.config; + +import java.io.IOException; + +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +@Component +public class SamlRequestFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String hub = request.getParameter("hubId"); + if (hub != null) { + request.setAttribute("hubId", hub); // Store the hub ID as an attribute + } + filterChain.doFilter(request, response); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index 868b0eae..c58318a2 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -1,9 +1,14 @@ package net.gepafin.tendermanagement.config; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.util.Base64; import java.util.List; import java.util.Map; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,6 +18,8 @@ import org.springframework.security.saml2.provider.service.authentication.Saml2A import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Element; import com.fasterxml.jackson.databind.ObjectMapper; @@ -62,6 +69,27 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { samlResponseLogEntity.setToken(token); samlResponseLogRepository.save(samlResponseLogEntity); + + // Extracting raw SAML response + String samlResponse = samlAuth.getSaml2Response(); + logger.info("Raw SAML Response: " + samlResponse); + + // Parsing the SAML response as XML + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(new ByteArrayInputStream(Base64.getDecoder().decode(samlResponse))); + + // Extracting ID, InResponseTo, and IssueInstant from the Response element + Element responseElement = (Element) document.getElementsByTagNameNS("urn:oasis:names:tc:SAML:2.0:protocol", "Response").item(0); + String responseId = responseElement.getAttribute("ID"); + String inResponseTo = responseElement.getAttribute("InResponseTo"); + String issueInstant = responseElement.getAttribute("IssueInstant"); + + logger.info("SAML Response ID: " + responseId); + logger.info("InResponseTo: " + inResponseTo); + logger.info("IssueInstant: " + issueInstant); + String redirectUrl = feBaseUrl; logger.info("SAML login successful for user: " + principal.getName()); diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 89182902..090f3688 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -15,6 +15,7 @@ import org.springframework.security.config.annotation.web.configurers.AbstractHt import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.saml2.provider.service.web.Saml2WebSsoAuthenticationRequestFilter; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; @@ -109,23 +110,19 @@ public class SecurityConfig { .requestMatchers("/v1/user/reset-password/initiate").permitAll() .requestMatchers("/v1/user/reset-password").permitAll() .anyRequest().authenticated()) - .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)) - .exceptionHandling(exceptionHandling -> exceptionHandling - .authenticationEntryPoint((request, response, authException) -> { - // Send 403 Forbidden when there is no JWT token provided - response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden: Authentication token is missing or invalid"); - }) - ) - .addFilterBefore(corsFilter(), UsernamePasswordAuthenticationFilter.class) - .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class) - // Add SAML2 login configuration (for BENEFICIARI) - /* - * .saml2Login(saml -> saml.loginPage("/saml/login") // Entry point for SAML - * login .defaultSuccessUrl("/") // Redirect after successful SAML login ); - */ - .saml2Login(saml -> saml.defaultSuccessUrl("/").successHandler(samlSuccessHandler) - .failureHandler(samlFailureHandler)); - + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)) + .exceptionHandling(exceptionHandling -> exceptionHandling + .authenticationEntryPoint((request, response, authException) -> { + // Send 403 Forbidden when there is no JWT token provided + response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden: Authentication token is missing or invalid"); + }) + ) + .addFilterBefore(corsFilter(), UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(new SamlRequestFilter(), Saml2WebSsoAuthenticationRequestFilter.class) // Add the custom SAML filter + .saml2Login(saml -> saml.defaultSuccessUrl("/") + .successHandler(samlSuccessHandler) + .failureHandler(samlFailureHandler)); return http.build(); } From d57ff4d0f5d8c13c92eb15c79442f6c8e0961c33 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 17 Oct 2024 20:07:22 -0700 Subject: [PATCH 3/4] Updated config --- .../tendermanagement/config/SamlSuccessHandler.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index c58318a2..d9eb870c 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -74,22 +74,22 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { String samlResponse = samlAuth.getSaml2Response(); logger.info("Raw SAML Response: " + samlResponse); - // Parsing the SAML response as XML + // If samlResponse is already in XML format, do not Base64 decode it DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); - Document document = builder.parse(new ByteArrayInputStream(Base64.getDecoder().decode(samlResponse))); - - // Extracting ID, InResponseTo, and IssueInstant from the Response element + Document document = builder.parse(new ByteArrayInputStream(samlResponse.getBytes())); // Remove the Base64 decoding + + // Extracting ID, InResponseTo, and IssueInstant from the Response element Element responseElement = (Element) document.getElementsByTagNameNS("urn:oasis:names:tc:SAML:2.0:protocol", "Response").item(0); String responseId = responseElement.getAttribute("ID"); String inResponseTo = responseElement.getAttribute("InResponseTo"); String issueInstant = responseElement.getAttribute("IssueInstant"); - + logger.info("SAML Response ID: " + responseId); logger.info("InResponseTo: " + inResponseTo); logger.info("IssueInstant: " + issueInstant); - + String redirectUrl = feBaseUrl; logger.info("SAML login successful for user: " + principal.getName()); From 162c87e0d5cbddbdbc1b03f0d781c5a7a85254e5 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 18 Oct 2024 15:27:56 +0530 Subject: [PATCH 4/4] updated code --- .../constants/GepafinConstant.java | 1 + .../net/gepafin/tendermanagement/dao/CallDao.java | 8 ++++++-- .../dao/EvaluationCriteriaDao.java | 7 +++++-- .../net/gepafin/tendermanagement/dao/FormDao.java | 14 ++++++++++---- .../entities/CriteriaFormFieldEntity.java | 4 ++++ .../repositories/CriteriaFormFieldRepository.java | 4 ++-- .../resources/db/changelog/db.changelog-1.0.0.xml | 12 ++++++------ src/main/resources/message_en.properties | 2 ++ src/main/resources/message_it.properties | 2 ++ 9 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 38121a98..2ffb9604 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -233,5 +233,6 @@ public class GepafinConstant { public static final String CANNOT_DELETE_COMPANY_WITH_APPLICATION_SUBMITT = "application.in.submit.status.cannot.delete.company"; public static final String GET_USERS_SUCCESS_MSG = "get.users.success.msg"; public static final String CANNOT_CREATE_BENEFICIARY_USER="cannot.create.beneficiary.user"; + public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 1a5e78da..3bba946a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -212,8 +212,12 @@ public class CallDao { private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) { evaluationCriteriaEntity.setIsDeleted(true); evaluationCriteriaRepository.save(evaluationCriteriaEntity); - List list = criteriaFormFieldRepository.findByEvaluationCriteriaId(evaluationCriteriaEntity.getId()); - criteriaFormFieldRepository.deleteAll(list); + List list = criteriaFormFieldRepository + .findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()) + .stream() + .peek(data -> data.setIsDeleted(Boolean.TRUE)) + .toList(); + criteriaFormFieldRepository.saveAll(list); } private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java index fbb0a7ba..b865121e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -81,8 +81,11 @@ public class EvaluationCriteriaDao { EvaluationCriteriaEntity evaluationCriteriaEntity = validateEvaluationCriteria(id); evaluationCriteriaEntity.setIsDeleted(Boolean.TRUE); evaluationCriteriaRepository.save(evaluationCriteriaEntity); - List list = criteriaFormFieldRepository.findByEvaluationCriteriaId(evaluationCriteriaEntity.getId()); - criteriaFormFieldRepository.deleteAll(list); + List list = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()) + .stream() + .peek(data -> data.setIsDeleted(Boolean.TRUE)) + .toList();; + criteriaFormFieldRepository.saveAll(list); } private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean( diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index c13545c2..5c43855e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -92,7 +92,7 @@ public class FormDao { ContentResponseBean.class); contentList.forEach(data -> { List criteriaIds = criteriaFormFieldRepository - .findByCallIdAndFormIdAndFormFieldId(formEntity.getCall().getId(), formEntity.getId(), data.getId()) + .findByCallIdAndFormIdAndFormFieldIdAndIsDeletedFalse(formEntity.getCall().getId(), formEntity.getId(), data.getId()) .stream().map(CriteriaFormFieldEntity::getEvaluationCriteriaId).toList(); data.setCriteria(criteriaIds); }); @@ -122,7 +122,7 @@ public class FormDao { contentResponseBeans.forEach(content -> { // Fetch existing records from the repository based on the call, form, and field ID List existingCriteriaFields = criteriaFormFieldRepository - .findByCallIdAndFormIdAndFormFieldId(callEntity.getId(), formEntity.getId(), content.getId()); + .findByCallIdAndFormIdAndFormFieldIdAndIsDeletedFalse(callEntity.getId(), formEntity.getId(), content.getId()); // Extract existing evaluation criteria IDs into a set for quick lookup Set existingEvaluationCriteriaIds = existingCriteriaFields.stream() @@ -139,10 +139,11 @@ public class FormDao { List toBeDeleted = existingCriteriaFields.stream() .filter(criteriaFormField -> !criteriaList.contains(criteriaFormField.getEvaluationCriteriaId())) + .peek(data->data.setIsDeleted(Boolean.TRUE)) .collect(Collectors.toList()); if (!toBeDeleted.isEmpty()) { - criteriaFormFieldRepository.deleteAll(toBeDeleted); + criteriaFormFieldRepository.saveAll(toBeDeleted); } }); } @@ -150,11 +151,16 @@ public class FormDao { private void createCriteriaFormField(CallEntity callEntity, FormEntity formEntity, String formFieldId,Long evaluationCriteriaId) { - evaluationCriteriaService.validateEvaluationCriteria(evaluationCriteriaId); + EvaluationCriteriaEntity evaluationCriteria = evaluationCriteriaService.validateEvaluationCriteria(evaluationCriteriaId); + if (Boolean.FALSE.equals(evaluationCriteria.getCall().getId().equals(callEntity.getId()))) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.EVALUATIONCRITERIA_INVALID)); + } CriteriaFormFieldEntity criteriaFormField = new CriteriaFormFieldEntity(); criteriaFormField.setCallId(callEntity.getId()); criteriaFormField.setFormId(formEntity.getId()); criteriaFormField.setFormFieldId(formFieldId); + criteriaFormField.setIsDeleted(Boolean.FALSE); criteriaFormField.setEvaluationCriteriaId(evaluationCriteriaId); criteriaFormFieldRepository.save(criteriaFormField); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java index 72876b92..1177bbd2 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.entities; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; @@ -16,5 +17,8 @@ public class CriteriaFormFieldEntity extends BaseEntity { private String formFieldId; private Long evaluationCriteriaId; + + @Column(name ="IS_DELETED", nullable = false) + private Boolean isDeleted = false; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java index 88f67da8..7f63d5e2 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java @@ -10,8 +10,8 @@ import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; @Repository public interface CriteriaFormFieldRepository extends JpaRepository{ - List findByCallIdAndFormIdAndFormFieldId(Long callId, Long formId, String formFieldId); + List findByCallIdAndFormIdAndFormFieldIdAndIsDeletedFalse(Long callId, Long formId, String formFieldId); - List findByEvaluationCriteriaId(Long evaluationCriteriaId); + List findByEvaluationCriteriaIdAndIsDeletedFalse(Long evaluationCriteriaId); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 75455b59..5aada016 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1113,6 +1113,9 @@ + + + @@ -1121,22 +1124,19 @@ baseColumnNames="call_id" referencedTableName="call" referencedColumnNames="id" - constraintName="fk_criteria_form_field_call_id" - onDelete="CASCADE"/> + constraintName="fk_criteria_form_field_call_id"/> + constraintName="fk_criteria_form_field_form_id"/> + constraintName="fk_criteria_form_field_evaluation_criteria_id"/> diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 683e335c..4ba49d72 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -253,6 +253,8 @@ get_login_attempt_se_msg=Login attempts fetched successfully. application.in.submit.status.cannot.delete.company=The company cannot be deleted because there are active applications in the SUBMITTED status. get.users.success.msg = Successfully fetched users. cannot.create.beneficiary.user = Creation of a Beneficiary user is not allowed. Please assign the appropriate role. +evaluationCriteria.invalid=This evaluation criterion does not belong to the current call. + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 4731e451..7c9dd9bc 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -250,4 +250,6 @@ application.in.submit.status.cannot.delete.company=Non get.users.success.msg = Utenti recuperati con successo cannot.create.beneficiary.user = La creazione di un utente beneficiario non è consentita. Si prega di assegnare il ruolo appropriato. +evaluationCriteria.invalid=Questo criterio di valutazione non appartiene alla chiamata corrente. +