Done ticket
This commit is contained in:
@@ -108,4 +108,18 @@ public class GepafinConstant {
|
|||||||
public static final String FLOW_FETCHED_SUCCESSFULLY="flow.fetched.successfully";
|
public static final String FLOW_FETCHED_SUCCESSFULLY="flow.fetched.successfully";
|
||||||
public static final String FLOW_ALREADY_EXISTS="flow.already.exists";
|
public static final String FLOW_ALREADY_EXISTS="flow.already.exists";
|
||||||
public static final String FLOW_REQUEST_NOT_PROPER="flow.request.not.complete";
|
public static final String FLOW_REQUEST_NOT_PROPER="flow.request.not.complete";
|
||||||
|
public static final String APPLICATION_CREATED_SUCCESS_MSG = "application.created.success";
|
||||||
|
public static final String APPLICATION_UPDATED_SUCCESS_MSG = "application.updated.success";
|
||||||
|
public static final String DELETE_APPLICATION_SUCCESS_MSG = "application.deleted.success";
|
||||||
|
public static final String GET_APPLICATION_SUCCESS_MSG = "application.get.success";
|
||||||
|
public static final String APPLICATION_NOT_FOUND_MSG = "application.not.found";
|
||||||
|
public static final String APPLICATION_FORM_FIELD_NOT_FOUND="application.form.field.not.found";
|
||||||
|
public static final String FORM_ID_DOES_NOT_MACTHES="Form.not.matches.to.call.initial.form";
|
||||||
|
public static final String VALIDATION_FIELD_REQUIRED = "validation.field.required";
|
||||||
|
public static final String VALIDATION_FIELD_MIN_LENGTH = "validation.field.min_length";
|
||||||
|
public static final String VALIDATION_FIELD_MAX_LENGTH = "validation.field.max_length";
|
||||||
|
public static final String VALIDATION_FIELD_PATTERN = "validation.field.pattern";
|
||||||
|
public static final String VALIDATION_FIELD_NOT_NULL = "validation.field.not_null";
|
||||||
|
public static final String VALIDATION_FIELD_NOT_EMPTY = "validation.field.not_empty";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,250 @@
|
|||||||
|
package net.gepafin.tendermanagement.dao;
|
||||||
|
|
||||||
|
import net.gepafin.tendermanagement.config.Translator;
|
||||||
|
import net.gepafin.tendermanagement.constants.GepafinConstant;
|
||||||
|
import net.gepafin.tendermanagement.entities.*;
|
||||||
|
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
|
||||||
|
import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean;
|
||||||
|
import net.gepafin.tendermanagement.model.request.ApplicationRequestBean;
|
||||||
|
import net.gepafin.tendermanagement.model.response.ApplicationFormFieldResponseBean;
|
||||||
|
import net.gepafin.tendermanagement.model.response.ApplicationResponseBean;
|
||||||
|
import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository;
|
||||||
|
import net.gepafin.tendermanagement.repositories.ApplicationFormRepository;
|
||||||
|
import net.gepafin.tendermanagement.repositories.ApplicationRepository;
|
||||||
|
import net.gepafin.tendermanagement.service.CallService;
|
||||||
|
import net.gepafin.tendermanagement.service.FormService;
|
||||||
|
import net.gepafin.tendermanagement.service.UserService;
|
||||||
|
import net.gepafin.tendermanagement.util.Utils;
|
||||||
|
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.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ApplicationDao {
|
||||||
|
|
||||||
|
private final Logger log = LoggerFactory.getLogger(ApplicationDao.class);
|
||||||
|
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CallService callService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserService userService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationRepository applicationRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationFormRepository applicationFormRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationFormFieldRepository applicationFormFieldRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FormService formService;
|
||||||
|
|
||||||
|
public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long callId) {
|
||||||
|
CallEntity call = callService.validateCall(callId);
|
||||||
|
FormEntity formEntity = formService.validateForm(applicationRequestBean.getFormId());
|
||||||
|
ApplicationEntity applicationEntity = getApplicationOrCreate(userEntity, call, formEntity);
|
||||||
|
formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity);
|
||||||
|
ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity);
|
||||||
|
createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity);
|
||||||
|
return getApplicationById(applicationEntity.getId(),formEntity.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationFormEntity saveApplicationFormEntity(ApplicationFormEntity applicationFormEntity) {
|
||||||
|
ApplicationFormEntity applicationFormEntity1 = applicationFormRepository.save(applicationFormEntity);
|
||||||
|
return applicationFormEntity1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validateFormId(FormEntity formEntity, CallEntity callEntity) {
|
||||||
|
if (Boolean.FALSE.equals(formEntity.getId().equals(callEntity.getInitialForm()))) {
|
||||||
|
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.FORM_ID_DOES_NOT_MACTHES));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationFormEntity createApplicationFormEntity(ApplicationEntity application, FormEntity formEntity) {
|
||||||
|
ApplicationFormEntity applicationFormEntity = new ApplicationFormEntity();
|
||||||
|
applicationFormEntity.setApplication(application);
|
||||||
|
applicationFormEntity.setForm(formEntity);
|
||||||
|
applicationFormEntity = saveApplicationFormEntity(applicationFormEntity);
|
||||||
|
return applicationFormEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call) {
|
||||||
|
ApplicationEntity entity = new ApplicationEntity();
|
||||||
|
entity.setUser(user);
|
||||||
|
entity.setCall(call);
|
||||||
|
entity.setIsDeleted(false);
|
||||||
|
entity.setStatus(ApplicationStatusTypeEnum.DRAFT.getValue());
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationResponseBean getApplicationById(Long id,Long formId) {
|
||||||
|
log.info("Fetching application with ID: {}", id);
|
||||||
|
|
||||||
|
ApplicationEntity applicationEntity = validateApplication(id);
|
||||||
|
List<ApplicationFormEntity> applicationFormEntities = applicationFormRepository.findByApplicationId(applicationEntity.getId());
|
||||||
|
List<ApplicationFormFieldResponseBean> applicationFormFieldResponseBeans=new ArrayList<>();
|
||||||
|
ApplicationFormFieldResponseBean applicationFormFieldResponseBeans1=null;
|
||||||
|
for (ApplicationFormEntity applicationFormEntity:applicationFormEntities){
|
||||||
|
List<ApplicationFormFieldEntity> applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId());
|
||||||
|
for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntities) {
|
||||||
|
applicationFormFieldResponseBeans1 = convertApplicationFormFieldEntityToApplicationFormFieldResponseBean(applicationFormFieldEntity, applicationFormEntity.getId());
|
||||||
|
applicationFormFieldResponseBeans.add(applicationFormFieldResponseBeans1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ApplicationResponseBean applicationResponseBean= convertApplicationEntityToApplicationResponseBean(applicationEntity);
|
||||||
|
applicationResponseBean.setFormFields(applicationFormFieldResponseBeans);
|
||||||
|
applicationResponseBean.setCurrentFormId(formId);
|
||||||
|
return applicationResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteById(Long id) {
|
||||||
|
log.info("Deleting application with ID: {}", id);
|
||||||
|
|
||||||
|
ApplicationEntity applicationEntity= validateApplication(id);
|
||||||
|
applicationEntity.setIsDeleted(true);
|
||||||
|
applicationEntity=saveApplicationEntity(applicationEntity);
|
||||||
|
log.info("Application deleted with ID: {}", id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ApplicationResponseBean> getAllApplications(Map<String, Object> userInfo) {
|
||||||
|
log.info("Fetching all applications");
|
||||||
|
String userIdStr = (String) userInfo.get("userId");
|
||||||
|
Long userId = Long.parseLong(userIdStr);
|
||||||
|
List<ApplicationEntity> applicationEntities = applicationRepository.findByUserIdAndIsDeletedFalse(userId);
|
||||||
|
List<Long> applicationIds = applicationEntities.stream()
|
||||||
|
.map(ApplicationEntity::getId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
List<ApplicationFormEntity> applicationFormEntities = applicationFormRepository.findByApplicationIdIn(applicationIds);
|
||||||
|
|
||||||
|
List<Long> applicationFormIds = applicationFormEntities.stream()
|
||||||
|
.map(ApplicationFormEntity::getId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
List<ApplicationFormFieldEntity> applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormIdIn(applicationFormIds);
|
||||||
|
|
||||||
|
|
||||||
|
return applicationEntities.stream().map(applicationEntity -> {
|
||||||
|
ApplicationResponseBean responseBean = new ApplicationResponseBean();
|
||||||
|
|
||||||
|
responseBean.setCallId(applicationEntity.getCall().getId());
|
||||||
|
responseBean.setSubmissionDate(applicationEntity.getSubmissionDate());
|
||||||
|
responseBean.setStatus(applicationEntity.getStatus());
|
||||||
|
responseBean.setComments(applicationEntity.getComments());
|
||||||
|
|
||||||
|
List<ApplicationFormFieldResponseBean> formFieldResponseBeans = applicationFormFieldEntities.stream()
|
||||||
|
.filter(field -> field.getApplicationForm().getApplication().getId().equals(applicationEntity.getId()))
|
||||||
|
.map(field -> {
|
||||||
|
ApplicationFormFieldResponseBean fieldResponseBean = new ApplicationFormFieldResponseBean();
|
||||||
|
fieldResponseBean.setId(field.getId());
|
||||||
|
fieldResponseBean.setFieldId(field.getFieldId());
|
||||||
|
fieldResponseBean.setApplicationFormId(field.getApplicationForm().getId());
|
||||||
|
fieldResponseBean.setFieldValue(field.getFieldValue());
|
||||||
|
return fieldResponseBean;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
responseBean.setFormFields(formFieldResponseBeans);
|
||||||
|
|
||||||
|
return responseBean;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationEntity validateApplication(Long id) {
|
||||||
|
ApplicationEntity applicationEntity= applicationRepository.findById(id).orElseThrow(() ->new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG)));
|
||||||
|
return applicationEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ApplicationResponseBean convertApplicationEntityToApplicationResponseBean(ApplicationEntity entity) {
|
||||||
|
ApplicationResponseBean response = new ApplicationResponseBean();
|
||||||
|
response.setId(entity.getId());
|
||||||
|
response.setSubmissionDate(entity.getSubmissionDate());
|
||||||
|
response.setStatus(entity.getStatus());
|
||||||
|
response.setComments(entity.getComments());
|
||||||
|
response.setCallId(entity.getCall().getId());
|
||||||
|
response.setCreatedDate(entity.getCreatedDate());
|
||||||
|
response.setUpdatedDate(entity.getUpdatedDate());
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationEntity getApplicationOrCreate(UserEntity userEntity, CallEntity callEntity, FormEntity formEntity) {
|
||||||
|
ApplicationEntity applicationEntity = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), callEntity.getId());
|
||||||
|
if (applicationEntity == null) {
|
||||||
|
validateFormId(formEntity, callEntity);
|
||||||
|
applicationEntity = createApplicationEntity(userEntity, callEntity);
|
||||||
|
applicationEntity=saveApplicationEntity(applicationEntity);
|
||||||
|
}
|
||||||
|
return applicationEntity;
|
||||||
|
}
|
||||||
|
private ApplicationFormEntity getApplicationFormOrCreate(FormEntity formEntity, ApplicationEntity applicationEntity) {
|
||||||
|
ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId());
|
||||||
|
if(applicationFormEntity == null){
|
||||||
|
applicationFormEntity = createApplicationFormEntity(applicationEntity, formEntity);
|
||||||
|
}
|
||||||
|
return applicationFormEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ApplicationFormFieldEntity> createOrUpdateMultipleFormFields(List<ApplicationFormFieldRequestBean> formFieldResponseBeans, ApplicationFormEntity applicationFormEntity) {
|
||||||
|
List<ApplicationFormFieldEntity> applicationFormFieldEntity = formFieldResponseBeans.stream()
|
||||||
|
.map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
return applicationFormFieldEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity) {
|
||||||
|
ApplicationFormFieldEntity applicationFormFieldEntity;
|
||||||
|
if (applicationFormFieldRequestBean.getId() == null || applicationFormFieldRequestBean.getId() == 0) {
|
||||||
|
applicationFormFieldEntity = new ApplicationFormFieldEntity();
|
||||||
|
applicationFormFieldEntity.setApplicationForm(applicationFormEntity);
|
||||||
|
} else {
|
||||||
|
applicationFormFieldEntity = validateApplicationFormField(applicationFormFieldRequestBean.getId());
|
||||||
|
}
|
||||||
|
Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId());
|
||||||
|
Utils.setIfUpdated(applicationFormFieldEntity::getFieldValue, applicationFormFieldEntity::setFieldValue, applicationFormFieldRequestBean.getFieldValue());
|
||||||
|
return applicationFormFieldRepository.save(applicationFormFieldEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationFormFieldEntity validateApplicationFormField(Long applicationFormFieldId) {
|
||||||
|
Optional<ApplicationFormFieldEntity> applicationFormFieldEntity = applicationFormFieldRepository.findById(applicationFormFieldId);
|
||||||
|
if (applicationFormFieldEntity.isEmpty()) {
|
||||||
|
throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_FORM_FIELD_NOT_FOUND));
|
||||||
|
}
|
||||||
|
return applicationFormFieldEntity.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ApplicationFormFieldEntity> saveApplicationFormFieldEntities(List<ApplicationFormFieldEntity> applicationFormFieldEntities) {
|
||||||
|
List<ApplicationFormFieldEntity> applicationFormFieldEntities1 = applicationFormFieldRepository.saveAll(applicationFormFieldEntities);
|
||||||
|
return applicationFormFieldEntities1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ApplicationFormFieldResponseBean> convertApplicationFormFieldEntitiesToApplicationFormFieldResponseBeans(List<ApplicationFormFieldEntity> applicationFormFieldEntities, Long applicationFormId) {
|
||||||
|
return applicationFormFieldEntities.stream()
|
||||||
|
.map(requestBean -> convertApplicationFormFieldEntityToApplicationFormFieldResponseBean(requestBean, applicationFormId))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationFormFieldResponseBean convertApplicationFormFieldEntityToApplicationFormFieldResponseBean(ApplicationFormFieldEntity applicationFormFieldEntity, Long applicationFormId) {
|
||||||
|
ApplicationFormFieldResponseBean applicationFormFieldResponseBean = new ApplicationFormFieldResponseBean();
|
||||||
|
applicationFormFieldResponseBean.setApplicationFormId(applicationFormId);
|
||||||
|
applicationFormFieldResponseBean.setFieldId(applicationFormFieldEntity.getFieldId());
|
||||||
|
applicationFormFieldResponseBean.setFieldValue(applicationFormFieldEntity.getFieldValue());
|
||||||
|
applicationFormFieldResponseBean.setId(applicationFormFieldEntity.getId());
|
||||||
|
applicationFormFieldResponseBean.setCreatedDate(applicationFormFieldEntity.getCreatedDate());
|
||||||
|
applicationFormFieldResponseBean.setUpdatedDate(applicationFormFieldEntity.getUpdatedDate());
|
||||||
|
return applicationFormFieldResponseBean;
|
||||||
|
}
|
||||||
|
public ApplicationEntity saveApplicationEntity(ApplicationEntity application){
|
||||||
|
ApplicationEntity applicationEntity=applicationRepository.save(application);
|
||||||
|
return applicationEntity;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,15 +2,19 @@ package net.gepafin.tendermanagement.dao;
|
|||||||
|
|
||||||
import net.gepafin.tendermanagement.config.Translator;
|
import net.gepafin.tendermanagement.config.Translator;
|
||||||
import net.gepafin.tendermanagement.constants.GepafinConstant;
|
import net.gepafin.tendermanagement.constants.GepafinConstant;
|
||||||
import net.gepafin.tendermanagement.entities.CallEntity;
|
import net.gepafin.tendermanagement.entities.*;
|
||||||
import net.gepafin.tendermanagement.entities.FormEntity;
|
import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean;
|
||||||
import net.gepafin.tendermanagement.model.request.ContentRequestBean;
|
import net.gepafin.tendermanagement.model.request.ContentRequestBean;
|
||||||
|
import net.gepafin.tendermanagement.model.request.FieldValidatorBean;
|
||||||
import net.gepafin.tendermanagement.model.request.FormRequest;
|
import net.gepafin.tendermanagement.model.request.FormRequest;
|
||||||
import net.gepafin.tendermanagement.model.response.ContentResponseBean;
|
import net.gepafin.tendermanagement.model.response.ContentResponseBean;
|
||||||
import net.gepafin.tendermanagement.model.response.FormResponseBean;
|
import net.gepafin.tendermanagement.model.response.FormResponseBean;
|
||||||
|
import net.gepafin.tendermanagement.repositories.ApplicationFormRepository;
|
||||||
|
import net.gepafin.tendermanagement.repositories.ApplicationRepository;
|
||||||
import net.gepafin.tendermanagement.repositories.FormRepository;
|
import net.gepafin.tendermanagement.repositories.FormRepository;
|
||||||
import net.gepafin.tendermanagement.service.CallService;
|
import net.gepafin.tendermanagement.service.CallService;
|
||||||
import net.gepafin.tendermanagement.util.DateTimeUtil;
|
import net.gepafin.tendermanagement.util.DateTimeUtil;
|
||||||
|
import net.gepafin.tendermanagement.util.FieldValidator;
|
||||||
import net.gepafin.tendermanagement.util.Utils;
|
import net.gepafin.tendermanagement.util.Utils;
|
||||||
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
|
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.ResourceNotFoundException;
|
||||||
@@ -20,6 +24,7 @@ import org.springframework.stereotype.Component;
|
|||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@@ -31,6 +36,12 @@ public class FormDao {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private CallService callService;
|
private CallService callService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationRepository applicationRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationFormRepository applicationFormRepository;
|
||||||
|
|
||||||
public FormEntity saveFormEntity(FormEntity formEntity){
|
public FormEntity saveFormEntity(FormEntity formEntity){
|
||||||
formEntity=formRepository.save(formEntity);
|
formEntity=formRepository.save(formEntity);
|
||||||
return formEntity;
|
return formEntity;
|
||||||
@@ -101,4 +112,37 @@ public class FormDao {
|
|||||||
public String setContentResponseBean(List<ContentRequestBean> contentRequestBeans){
|
public String setContentResponseBean(List<ContentRequestBean> contentRequestBeans){
|
||||||
return Utils.convertListToJsonString(contentRequestBeans);
|
return Utils.convertListToJsonString(contentRequestBeans);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void validateFormField(List<ApplicationFormFieldRequestBean> applicationFormFieldRequestList, ApplicationEntity applicationEntity, FormEntity formEntity) {
|
||||||
|
|
||||||
|
Map<String, String> formFieldMap = applicationFormFieldRequestList.stream()
|
||||||
|
.collect(Collectors.toMap(ApplicationFormFieldRequestBean::getFieldId, ApplicationFormFieldRequestBean::getFieldValue));
|
||||||
|
FormResponseBean formResponseBean = convertFormEntityToFormResponseBean(formEntity);
|
||||||
|
ApplicationFormEntity applicationFormEntity=applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),formEntity.getId());
|
||||||
|
Boolean isApplicationFormExist= getApplicationFormExist(applicationFormEntity);
|
||||||
|
FieldValidator validator = FieldValidator.create();
|
||||||
|
formResponseBean.getContent().forEach(contentResponseBean -> {
|
||||||
|
String fieldId = contentResponseBean.getId();
|
||||||
|
String value = formFieldMap.get(fieldId);
|
||||||
|
if(value == null && isApplicationFormExist) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean, FieldValidatorBean.class);
|
||||||
|
validator
|
||||||
|
.notNull(value, fieldId)
|
||||||
|
.minLength(value, fieldValidatorBean.getMinLength(), fieldId) // Only applies if minLength is not null
|
||||||
|
.maxLength(value, fieldValidatorBean.getMaxLength(), fieldId) // Only applies if maxLength is not null
|
||||||
|
.matchesPattern(value, fieldValidatorBean.getPattern(), fieldId); // Only applies if pattern is present
|
||||||
|
});
|
||||||
|
|
||||||
|
validator.validate();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean getApplicationFormExist(ApplicationFormEntity applicationFormEntity) {
|
||||||
|
if(applicationFormEntity !=null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package net.gepafin.tendermanagement.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "APPLICATION")
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class ApplicationEntity extends BaseEntity {
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "USER_ID", nullable = false)
|
||||||
|
private UserEntity user;
|
||||||
|
|
||||||
|
@Column(name = "SUBMISSION_DATE")
|
||||||
|
private LocalDateTime submissionDate;
|
||||||
|
|
||||||
|
@Column(name = "STATUS", length = 255)
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@Column(name = "COMMENTS", columnDefinition = "TEXT")
|
||||||
|
private String comments;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "CALL_ID", nullable = false)
|
||||||
|
private CallEntity call;
|
||||||
|
|
||||||
|
@Column(name="IS_DELETED")
|
||||||
|
private Boolean isDeleted;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package net.gepafin.tendermanagement.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "APPLICATION_FORM")
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class ApplicationFormEntity extends BaseEntity {
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "APPLICATION_ID", nullable = false)
|
||||||
|
private ApplicationEntity application;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "FORM_ID", nullable = false)
|
||||||
|
private FormEntity form;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package net.gepafin.tendermanagement.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "APPLICATION_FORM_FIELD")
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class ApplicationFormFieldEntity extends BaseEntity {
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "APPLICATION_FORM_ID", nullable = false)
|
||||||
|
private ApplicationFormEntity applicationForm;
|
||||||
|
|
||||||
|
@Column(name = "FIELD_ID")
|
||||||
|
private String fieldId;
|
||||||
|
|
||||||
|
@Column(name = "FIELD_VALUE", length = 255)
|
||||||
|
private String fieldValue;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package net.gepafin.tendermanagement.enums;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonValue;
|
||||||
|
|
||||||
|
public enum ApplicationStatusTypeEnum {
|
||||||
|
|
||||||
|
DRAFT("DRAFT"),
|
||||||
|
SUBMIT("SUBMIT"),
|
||||||
|
EXPIRED("EXPIRED"),
|
||||||
|
READY_TO_SUBMIT("READY_TO_SUBMIT");
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
ApplicationStatusTypeEnum(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonValue
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import lombok.Data;
|
||||||
|
import net.gepafin.tendermanagement.entities.ApplicationFormEntity;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ApplicationFormFieldRequestBean {
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String fieldId;
|
||||||
|
|
||||||
|
private String fieldValue;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ApplicationRequestBean {
|
||||||
|
|
||||||
|
private Long formId;
|
||||||
|
|
||||||
|
private List<ApplicationFormFieldRequestBean> formFields;
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class FieldValidatorBean {
|
||||||
|
|
||||||
|
private Boolean isRequired;
|
||||||
|
|
||||||
|
private Long minLength;
|
||||||
|
|
||||||
|
private Long maxLength;
|
||||||
|
|
||||||
|
private String pattern;
|
||||||
|
|
||||||
|
private String custom;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.response;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import net.gepafin.tendermanagement.model.BaseBean;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ApplicationFormFieldResponseBean extends BaseBean {
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private Long applicationFormId;
|
||||||
|
|
||||||
|
private String fieldId;
|
||||||
|
|
||||||
|
private String fieldValue;
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.response;
|
||||||
|
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import lombok.Data;
|
||||||
|
import net.gepafin.tendermanagement.model.BaseBean;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ApplicationResponseBean extends BaseBean {
|
||||||
|
|
||||||
|
private Long callId;
|
||||||
|
|
||||||
|
private LocalDateTime submissionDate;
|
||||||
|
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
private String comments;
|
||||||
|
|
||||||
|
private List<ApplicationFormFieldResponseBean> formFields;
|
||||||
|
|
||||||
|
private Long currentFormId;
|
||||||
|
|
||||||
|
private Long nextFormId;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package net.gepafin.tendermanagement.repositories;
|
||||||
|
|
||||||
|
import net.gepafin.tendermanagement.entities.ApplicationFormFieldEntity;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface ApplicationFormFieldRepository extends JpaRepository<ApplicationFormFieldEntity,Long> {
|
||||||
|
|
||||||
|
public List<ApplicationFormFieldEntity> findByApplicationFormIdIn(List<Long> applicationFormIds);
|
||||||
|
|
||||||
|
public List<ApplicationFormFieldEntity> findByApplicationFormId(Long applicationFormId);
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package net.gepafin.tendermanagement.repositories;
|
||||||
|
|
||||||
|
import net.gepafin.tendermanagement.entities.ApplicationFormEntity;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface ApplicationFormRepository extends JpaRepository<ApplicationFormEntity, Long> {
|
||||||
|
|
||||||
|
public ApplicationFormEntity findByApplicationIdAndFormId(Long applicationId,Long formId);
|
||||||
|
|
||||||
|
List<ApplicationFormEntity> findByApplicationIdIn(List<Long> applicationIds);
|
||||||
|
|
||||||
|
public List<ApplicationFormEntity> findByApplicationId(Long applicationId);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package net.gepafin.tendermanagement.repositories;
|
||||||
|
|
||||||
|
import net.gepafin.tendermanagement.entities.ApplicationEntity;
|
||||||
|
import net.gepafin.tendermanagement.entities.FaqEntity;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.data.repository.query.Param;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface ApplicationRepository extends JpaRepository<ApplicationEntity,Long> {
|
||||||
|
|
||||||
|
public ApplicationEntity findByUserIdAndCallIdAndIsDeletedFalse(Long userId,Long callId);
|
||||||
|
|
||||||
|
public List<ApplicationEntity> findByUserIdAndIsDeletedFalse(Long userId);
|
||||||
|
|
||||||
|
@Query("SELECT a FROM ApplicationEntity a WHERE a.id = :id AND a.isDeleted = false")
|
||||||
|
Optional<ApplicationEntity> findById(@Param("id") Long id);
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package net.gepafin.tendermanagement.service;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import net.gepafin.tendermanagement.entities.ApplicationEntity;
|
||||||
|
import net.gepafin.tendermanagement.model.request.ApplicationRequestBean;
|
||||||
|
import net.gepafin.tendermanagement.model.response.ApplicationResponseBean;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface ApplicationService {
|
||||||
|
|
||||||
|
public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long callId);
|
||||||
|
|
||||||
|
ApplicationResponseBean getApplicationById(HttpServletRequest request, Long applicationId);
|
||||||
|
|
||||||
|
List<ApplicationResponseBean> getAllApplications(HttpServletRequest request);
|
||||||
|
|
||||||
|
void deleteApplication(HttpServletRequest request, Long applicationId);
|
||||||
|
|
||||||
|
public ApplicationEntity validateApplication(Long userId);
|
||||||
|
}
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
package net.gepafin.tendermanagement.service;
|
package net.gepafin.tendermanagement.service;
|
||||||
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import net.gepafin.tendermanagement.entities.ApplicationEntity;
|
||||||
import net.gepafin.tendermanagement.entities.FormEntity;
|
import net.gepafin.tendermanagement.entities.FormEntity;
|
||||||
|
import net.gepafin.tendermanagement.entities.UserEntity;
|
||||||
|
import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean;
|
||||||
import net.gepafin.tendermanagement.model.request.FormRequest;
|
import net.gepafin.tendermanagement.model.request.FormRequest;
|
||||||
import net.gepafin.tendermanagement.model.response.FormResponseBean;
|
import net.gepafin.tendermanagement.model.response.FormResponseBean;
|
||||||
|
|
||||||
@@ -20,4 +23,6 @@ public interface FormService {
|
|||||||
public FormEntity validateForm(Long id);
|
public FormEntity validateForm(Long id);
|
||||||
|
|
||||||
public List<FormResponseBean> getFormsByCallId(HttpServletRequest request,Long callId);
|
public List<FormResponseBean> getFormsByCallId(HttpServletRequest request,Long callId);
|
||||||
|
|
||||||
|
void validateFormField(List<ApplicationFormFieldRequestBean> formFields, ApplicationEntity applicationEntity, FormEntity formEntity);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package net.gepafin.tendermanagement.service.impl;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import net.gepafin.tendermanagement.dao.ApplicationDao;
|
||||||
|
import net.gepafin.tendermanagement.entities.ApplicationEntity;
|
||||||
|
import net.gepafin.tendermanagement.entities.UserEntity;
|
||||||
|
import net.gepafin.tendermanagement.model.request.ApplicationRequestBean;
|
||||||
|
import net.gepafin.tendermanagement.model.response.ApplicationResponseBean;
|
||||||
|
import net.gepafin.tendermanagement.service.ApplicationService;
|
||||||
|
import net.gepafin.tendermanagement.util.Validator;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ApplicationServiceImpl implements ApplicationService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationDao applicationDao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Validator validator;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long callId) {
|
||||||
|
UserEntity userEntity = validator.validateUser(request);
|
||||||
|
return applicationDao.createApplication(applicationRequestBean,userEntity,callId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public ApplicationResponseBean getApplicationById(HttpServletRequest request, Long applicationId) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void deleteApplication(HttpServletRequest request, Long applicationId) {
|
||||||
|
applicationDao.deleteById(applicationId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ApplicationEntity validateApplication(Long id) {
|
||||||
|
return applicationDao.validateApplication(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public List<ApplicationResponseBean> getAllApplications(HttpServletRequest request) {
|
||||||
|
Map<String,Object> userInfo=validator.getUserInfoFromToken(request);
|
||||||
|
return applicationDao.getAllApplications(userInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,7 +2,10 @@ package net.gepafin.tendermanagement.service.impl;
|
|||||||
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import net.gepafin.tendermanagement.dao.FormDao;
|
import net.gepafin.tendermanagement.dao.FormDao;
|
||||||
|
import net.gepafin.tendermanagement.entities.ApplicationEntity;
|
||||||
import net.gepafin.tendermanagement.entities.FormEntity;
|
import net.gepafin.tendermanagement.entities.FormEntity;
|
||||||
|
import net.gepafin.tendermanagement.entities.UserEntity;
|
||||||
|
import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean;
|
||||||
import net.gepafin.tendermanagement.model.request.FormRequest;
|
import net.gepafin.tendermanagement.model.request.FormRequest;
|
||||||
import net.gepafin.tendermanagement.model.response.FormResponseBean;
|
import net.gepafin.tendermanagement.model.response.FormResponseBean;
|
||||||
import net.gepafin.tendermanagement.service.FormService;
|
import net.gepafin.tendermanagement.service.FormService;
|
||||||
@@ -47,4 +50,10 @@ public class FormServiceImpl implements FormService {
|
|||||||
public List<FormResponseBean> getFormsByCallId(HttpServletRequest request, Long callId) {
|
public List<FormResponseBean> getFormsByCallId(HttpServletRequest request, Long callId) {
|
||||||
return formDao.getFormsByCallId(callId);
|
return formDao.getFormsByCallId(callId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void validateFormField(List<ApplicationFormFieldRequestBean> formFields, ApplicationEntity applicationEntity, FormEntity formEntity) {
|
||||||
|
formDao.validateFormField(formFields,applicationEntity, formEntity);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,4 +37,24 @@ public class FieldValidator {
|
|||||||
throw new ValidationException(Status.VALIDATION_ERROR, errors);
|
throw new ValidationException(Status.VALIDATION_ERROR, errors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public FieldValidator minLength(String value, Long minLength, String fieldName) {
|
||||||
|
if (minLength != null && value != null && value.length() < minLength) {
|
||||||
|
errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN_LENGTH), fieldName, minLength));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldValidator maxLength(String value, Long maxLength, String fieldName) {
|
||||||
|
if (maxLength != null && value != null && value.length() > maxLength) {
|
||||||
|
errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX_LENGTH), fieldName, maxLength));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldValidator matchesPattern(String value, String pattern, String fieldName) {
|
||||||
|
if (value != null && pattern != null && !value.matches(pattern)) {
|
||||||
|
errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_PATTERN), fieldName));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ import com.fasterxml.jackson.core.json.JsonReadFeature;
|
|||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
|
import com.fasterxml.jackson.databind.type.TypeFactory;
|
||||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||||
import io.micrometer.common.util.StringUtils;
|
import io.micrometer.common.util.StringUtils;
|
||||||
import org.apache.commons.collections4.MapUtils;
|
import org.apache.commons.collections4.MapUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -99,7 +101,13 @@ public class Utils {
|
|||||||
}
|
}
|
||||||
public static <T> List<T> convertJsonStringToList(String jsonString, Class<T> clazz) {
|
public static <T> List<T> convertJsonStringToList(String jsonString, Class<T> clazz) {
|
||||||
try {
|
try {
|
||||||
return mapper.readValue(jsonString, new TypeReference<List<T>>() {});
|
TypeReference<List<T>> typeRef = new TypeReference<List<T>>() {
|
||||||
|
@Override
|
||||||
|
public Type getType() {
|
||||||
|
return TypeFactory.defaultInstance().constructCollectionType(List.class, clazz);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return mapper.readValue(jsonString, typeRef);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
// Handle the exception appropriately (e.g., throw a custom exception)
|
// Handle the exception appropriately (e.g., throw a custom exception)
|
||||||
@@ -129,5 +137,14 @@ public class Utils {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
public static <T, U> U convertSourceObjectToDestinationObject(T source, Class<U> destinationClass) {
|
||||||
|
try {
|
||||||
|
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
|
||||||
|
mapper.registerModule(new JavaTimeModule());
|
||||||
|
return mapper.convertValue(source, destinationClass);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Error converting object: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
package net.gepafin.tendermanagement.web.rest.api;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Content;
|
||||||
|
import io.swagger.v3.oas.annotations.media.ExampleObject;
|
||||||
|
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import net.gepafin.tendermanagement.model.request.ApplicationRequestBean;
|
||||||
|
import net.gepafin.tendermanagement.model.response.ApplicationResponseBean;
|
||||||
|
import net.gepafin.tendermanagement.model.util.Response;
|
||||||
|
import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Validated
|
||||||
|
public interface ApplicationApi {
|
||||||
|
|
||||||
|
@Operation(summary = "Api to create or update application",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "OK"),
|
||||||
|
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
|
||||||
|
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })),
|
||||||
|
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
|
||||||
|
@PutMapping(value = "/call/{callId}",
|
||||||
|
produces = { "application/json" })
|
||||||
|
ResponseEntity<Response<ApplicationResponseBean>> createApplication(HttpServletRequest request,
|
||||||
|
@Parameter(description = " Flow request object", required = true) @Valid @RequestBody ApplicationRequestBean applicationRequestBean,
|
||||||
|
@Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId);
|
||||||
|
|
||||||
|
@Operation(summary = "Api to get an application by id",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "OK"),
|
||||||
|
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
|
||||||
|
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })),
|
||||||
|
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
|
||||||
|
@GetMapping(value = "/{applicationId}", produces = "application/json")
|
||||||
|
ResponseEntity<Response<ApplicationResponseBean>> getApplicationById(HttpServletRequest request,
|
||||||
|
@Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId);
|
||||||
|
|
||||||
|
@Operation(summary = "Api to get all applications",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "OK"),
|
||||||
|
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
|
||||||
|
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })),
|
||||||
|
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
|
||||||
|
@GetMapping(value = "", produces = "application/json")
|
||||||
|
ResponseEntity<Response<List<ApplicationResponseBean>>> getAllApplications(HttpServletRequest request);
|
||||||
|
|
||||||
|
@Operation(summary = "Api to delete application",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "OK"),
|
||||||
|
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
|
||||||
|
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })),
|
||||||
|
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
|
||||||
|
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
|
||||||
|
@DeleteMapping(value = "/{applicationId}")
|
||||||
|
ResponseEntity<Response<Void>> deleteApplication(HttpServletRequest request,
|
||||||
|
@Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package net.gepafin.tendermanagement.web.rest.api.impl;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import net.gepafin.tendermanagement.config.Translator;
|
||||||
|
import net.gepafin.tendermanagement.constants.GepafinConstant;
|
||||||
|
import net.gepafin.tendermanagement.model.request.ApplicationRequestBean;
|
||||||
|
import net.gepafin.tendermanagement.model.response.ApplicationResponseBean;
|
||||||
|
import net.gepafin.tendermanagement.model.response.FlowResponseBean;
|
||||||
|
import net.gepafin.tendermanagement.model.util.Response;
|
||||||
|
import net.gepafin.tendermanagement.service.ApplicationService;
|
||||||
|
import net.gepafin.tendermanagement.web.rest.api.ApplicationApi;
|
||||||
|
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("${openapi.gepafin.base-path:/v1/application}")
|
||||||
|
public class ApplicationApiController implements ApplicationApi {
|
||||||
|
|
||||||
|
private final Logger log = LoggerFactory.getLogger(ApplicationApiController.class);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationService applicationService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<Response<ApplicationResponseBean>> createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long callId) {
|
||||||
|
ApplicationResponseBean applicationResponseBean= applicationService.createApplication(request,applicationRequestBean,callId);
|
||||||
|
return ResponseEntity.status(HttpStatus.CREATED)
|
||||||
|
.body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG))); }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<Response<ApplicationResponseBean>> getApplicationById(HttpServletRequest request,
|
||||||
|
Long applicationId) {
|
||||||
|
log.info("Get Application by ID - Application ID: {}", applicationId);
|
||||||
|
ApplicationResponseBean application = applicationService.getApplicationById(request,applicationId);
|
||||||
|
return ResponseEntity.status(HttpStatus.OK)
|
||||||
|
.body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<Response<Void>> deleteApplication(HttpServletRequest request,
|
||||||
|
Long applicationId) {
|
||||||
|
log.info("Delete Application - Application ID: {}", applicationId);
|
||||||
|
applicationService.deleteApplication(request,applicationId);
|
||||||
|
return ResponseEntity.status(HttpStatus.OK)
|
||||||
|
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_APPLICATION_SUCCESS_MSG)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<Response<List<ApplicationResponseBean>>> getAllApplications(HttpServletRequest request) {
|
||||||
|
List<ApplicationResponseBean> applications = applicationService.getAllApplications(request);
|
||||||
|
log.info("Get All Applications");
|
||||||
|
return ResponseEntity.status(HttpStatus.OK)
|
||||||
|
.body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG)));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -633,4 +633,40 @@
|
|||||||
<column name="final_form" type="INTEGER"></column>
|
<column name="final_form" type="INTEGER"></column>
|
||||||
</addColumn>
|
</addColumn>
|
||||||
</changeSet>
|
</changeSet>
|
||||||
|
|
||||||
|
<changeSet id="11-09-2024_1" author="Rajesh Khore">
|
||||||
|
<createTable tableName="application">
|
||||||
|
<column name="id" type="INTEGER" autoIncrement="true">
|
||||||
|
<constraints nullable="false" primaryKey="true" primaryKeyName="application_pkey"/>
|
||||||
|
</column>
|
||||||
|
<column name="user_id" type="INTEGER">
|
||||||
|
<constraints nullable="false" foreignKeyName="fk_user_application" references="gepafin_user(id)"/>
|
||||||
|
</column>
|
||||||
|
<column name="submission_date" type="TIMESTAMP WITHOUT TIME ZONE"></column>
|
||||||
|
<column name="status" type="VARCHAR(255)"></column>
|
||||||
|
<column name="comments" type="TEXT"></column>
|
||||||
|
<column name="call_id" type="INTEGER">
|
||||||
|
<constraints nullable="false" foreignKeyName="fk_call_application" references="call(id)"/>
|
||||||
|
</column>
|
||||||
|
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="created_date" type="TIMESTAMP WITHOUT TIME ZONE">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="updated_date" type="TIMESTAMP WITHOUT TIME ZONE">
|
||||||
|
<constraints nullable="true"/></column>
|
||||||
|
</createTable>
|
||||||
|
|
||||||
|
<addColumn tableName="application_form">
|
||||||
|
<column name="application_id" type="INTEGER">
|
||||||
|
<constraints nullable="false" foreignKeyName="fk_application_application_form" references="application(id)"/>
|
||||||
|
</column>
|
||||||
|
</addColumn>
|
||||||
|
|
||||||
|
<dropColumn tableName="application_form">
|
||||||
|
<column name="order_no" type="VARCHAR(255)"></column>
|
||||||
|
</dropColumn>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
|
|||||||
@@ -139,3 +139,20 @@ flow.created.successfully=Flow created successfully.
|
|||||||
flow.fetched.successfully=Flow fetched successfully.
|
flow.fetched.successfully=Flow fetched successfully.
|
||||||
flow.already.exists= Flow already exist for this call.
|
flow.already.exists= Flow already exist for this call.
|
||||||
flow.request.not.complete=Flow request is not complete.
|
flow.request.not.complete=Flow request is not complete.
|
||||||
|
|
||||||
|
# Application related messages
|
||||||
|
application.created.success=Application successfully created.
|
||||||
|
application.updated.success=Application successfully updated.
|
||||||
|
application.deleted.success=Application successfully deleted.
|
||||||
|
application.get.success=Application details fetched successfully.
|
||||||
|
application.not.found=Application not found with the given ID.
|
||||||
|
application.form.field.not.found=Application form field not found.
|
||||||
|
Form.not.matches.to.call.initial.form=Form id does not matches to initial form id of call.
|
||||||
|
|
||||||
|
#Validation related messages
|
||||||
|
validation.field.required=Field {0} is required.
|
||||||
|
validation.field.min_length=Field {0} must be at least {1} characters long.
|
||||||
|
validation.field.max_length=Field {0} must be no more than {1} characters long.
|
||||||
|
validation.field.pattern=Field {0} does not match the required pattern.
|
||||||
|
validation.field.not_null=Field {0} must not be null.
|
||||||
|
validation.field.not_empty=Field {0} must not be empty.
|
||||||
@@ -56,7 +56,7 @@ status.same.error=Lo stato <20> gi<67> impostato.
|
|||||||
invalid.status.change.from.draft=Lo stato non pu<70> essere cambiato in READY_TO_PUBLISH o PUBLISH da DRAFT.
|
invalid.status.change.from.draft=Lo stato non pu<70> essere cambiato in READY_TO_PUBLISH o PUBLISH da DRAFT.
|
||||||
status.cannot.be.changed=Lo stato non pu<70> essere cambiato.
|
status.cannot.be.changed=Lo stato non pu<70> essere cambiato.
|
||||||
published.call.not.update=Il bando pubblicato non pu<70> essere aggiornato.
|
published.call.not.update=Il bando pubblicato non pu<70> essere aggiornato.
|
||||||
invalid.status.change.from.publish=Lo stato non può essere modificato in READY_TO_PUBLISH o DRAFT da PUBLISH.
|
invalid.status.change.from.publish=Lo stato non pu<EFBFBD> essere modificato in READY_TO_PUBLISH o DRAFT da PUBLISH.
|
||||||
|
|
||||||
|
|
||||||
# Login-related messages
|
# Login-related messages
|
||||||
@@ -115,7 +115,7 @@ lookupdata.created.successfully=LookUpData creato correttamente.
|
|||||||
lookupdata.fetched.successfully=LookUpData recuperato correttamente.
|
lookupdata.fetched.successfully=LookUpData recuperato correttamente.
|
||||||
lookupdata.updated.successfully=LookUpData aggiornato correttamente.
|
lookupdata.updated.successfully=LookUpData aggiornato correttamente.
|
||||||
lookupdata.deleted.successfully=LookUpData eliminato correttamente.
|
lookupdata.deleted.successfully=LookUpData eliminato correttamente.
|
||||||
lookupdata.value.cannot.be.empty=Il campo valore non può essere vuoto
|
lookupdata.value.cannot.be.empty=Il campo valore non pu<EFBFBD> essere vuoto
|
||||||
|
|
||||||
#Document-related message
|
#Document-related message
|
||||||
document.updated.successfully=Documento aggiornato con successo.
|
document.updated.successfully=Documento aggiornato con successo.
|
||||||
@@ -133,5 +133,22 @@ update.user.status.success=Lo stato dell'utente <20> stato aggiornato con success
|
|||||||
#Flow-related message
|
#Flow-related message
|
||||||
flow.created.successfully=Flusso creato con successo.
|
flow.created.successfully=Flusso creato con successo.
|
||||||
flow.fetched.successfully=Flusso recuperato con successo.
|
flow.fetched.successfully=Flusso recuperato con successo.
|
||||||
flow.already.exists= Il flusso esiste già per questa chiamata.
|
flow.already.exists= Il flusso esiste gi<EFBFBD> per questa chiamata.
|
||||||
flow.request.not.complete=La richiesta di flusso non è completa.
|
flow.request.not.complete=La richiesta di flusso non <EFBFBD> completa.
|
||||||
|
|
||||||
|
# Application related messages
|
||||||
|
application.created.success=Applicazione creata con successo.
|
||||||
|
application.updated.success=Applicazione aggiornata con successo.
|
||||||
|
application.deleted.success=Applicazione eliminata con successo.
|
||||||
|
application.get.success=Dettagli dell'applicazione recuperati con successo.
|
||||||
|
application.not.found=Applicazione non trovata con l'ID fornito.
|
||||||
|
application.form.field.not.found=Campo del modulo di domanda non trovato.
|
||||||
|
Form.not.matches.to.call.initial.form=L'ID del modulo non corrisponde all'ID del modulo iniziale della chiamata.
|
||||||
|
|
||||||
|
#Validation related messages
|
||||||
|
validation.field.required=Il campo {0} <20> obbligatorio.
|
||||||
|
validation.field.min_length=Il campo {0} deve essere lungo almeno {1} caratteri.
|
||||||
|
validation.field.max_length=Il campo {0} deve essere lungo al massimo {1} caratteri.
|
||||||
|
validation.field.pattern=Il campo {0} non corrisponde al modello richiesto.
|
||||||
|
validation.field.not_null=Il campo {0} non deve essere nullo.
|
||||||
|
validation.field.not_empty=Il campo {0} non deve essere vuoto.
|
||||||
Reference in New Issue
Block a user