diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 017870ed..1f90b544 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -983,7 +983,7 @@ public class ApplicationDao { } private String generateS3PathForDelegation(Long callId, Long applicationId) { try { - return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId); + return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId,0L); } catch (IllegalArgumentException e) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); } @@ -1125,7 +1125,7 @@ public class ApplicationDao { try (ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { - String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION, applicationEntity.getCall().getId(), applicationId); + String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION, applicationEntity.getCall().getId(), applicationId,0L); for (DocumentEntity document : documents) { String fileName = Utils.extractFileName(document.getFilePath()); @@ -1133,7 +1133,7 @@ public class ApplicationDao { } if (signedDocument != null) { - String signedDocS3Folder = s3PathConfig.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, applicationEntity.getCall().getId(), applicationId); + String signedDocS3Folder = s3PathConfig.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, applicationEntity.getCall().getId(), applicationId,0L); String signedDocFileName = signedDocument.getFileName(); addDocumentToZip(zos, signedDocS3Folder, signedDocument.getFilePath(), signedDocFileName); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index b19a50d2..ce5d8c28 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -120,7 +120,7 @@ public class CallDao { ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { for (DocumentEntity document : documents) { - String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.CALL, callId, 0L); + String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.CALL, callId, 0L,0L); try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFilePath())) { String fileName = Utils.extractFileName(document.getFilePath()); ZipEntry zipEntry = new ZipEntry(fileName); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index 3fd9d83f..407a8aff 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -69,7 +69,7 @@ public class DelegationDao { public ByteArrayOutputStream generateDocument(Map placeholders, String templateName) { try { - String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L); + String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L,0L); InputStream templateStream = amazonS3Service.getFile(s3Folder ,templateName); XWPFDocument doc = loadTemplate(templateStream); replacePlaceholders(doc, placeholders); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index c2339d5d..c4cab6b2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -9,9 +9,11 @@ import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; +import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.service.AmazonS3Service; +import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -50,11 +52,16 @@ public class DocumentDao { @Autowired ApplicationService applicationService; + @Autowired + ApplicationAmendmentRequestService applicationAmendmentRequestService; + + @Autowired + ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; + @Value("${aws.s3.bucket.name}") private String bucketName; - // @Value("${aws.s3.url.folder}") // private String s3Folder; @@ -77,30 +84,38 @@ public class DocumentDao { documentRepository.saveAll(documentEntities); return documentEntities.stream().map(callDao::convertToDocumentResponseBean).collect(Collectors.toList()); } + private UploadFileOnAmazonS3Response uploadFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long sourceId) { - Long applicationId = 0L; + Long applicationId = 0L; + Long amendmentId = 0L; Long callId = sourceId; if (type == DocumentSourceTypeEnum.APPLICATION) { applicationId = sourceId; callId = applicationFormRepository.findCallIdById(applicationId); + } else if (type == DocumentSourceTypeEnum.AMENDMENT) { + amendmentId = sourceId; + ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId); + applicationId = applicationEntity.getId(); + callId = applicationEntity.getCall().getId(); } try { - String s3Path = generateS3Path(type, callId, applicationId); + String s3Path = generateS3Path(type, callId, applicationId, amendmentId); log.info("Generated S3 path {}", s3Path); return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); } catch (Exception e) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); } } - public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId) { + public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId, Long amendmentId) { try { - return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId); + return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId, amendmentId); } catch (IllegalArgumentException e) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); } } + private Long resolveSourceId(Long sourceId, DocumentSourceTypeEnum sourceType) { if (sourceType == DocumentSourceTypeEnum.CALL) { CallEntity callEntity = callService.validateCall(sourceId); @@ -119,16 +134,23 @@ public class DocumentDao { DocumentEntity documentEntity = validateDocument(documentId); Long callId = null; Long applicationId = null; + Long amendmentId = null; - if ("CALL".equalsIgnoreCase(documentEntity.getSource())) { + if (DocumentSourceTypeEnum.CALL.getValue().equalsIgnoreCase(documentEntity.getSource())) { callId = documentEntity.getSourceId(); - } else if ("APPLICATION".equalsIgnoreCase(documentEntity.getSource())) { + } else if (DocumentSourceTypeEnum.APPLICATION.getValue().equalsIgnoreCase(documentEntity.getSource())) { applicationId = documentEntity.getSourceId(); ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); callId = applicationEntity.getCall().getId(); } + else if(DocumentSourceTypeEnum.AMENDMENT.getValue().equalsIgnoreCase(documentEntity.getSource())){ + amendmentId = documentEntity.getSourceId(); + ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId); + applicationId = applicationEntity.getId(); + callId = applicationEntity.getCall().getId(); + } - amazonS3Service.deleteFileFromS3(documentEntity,callId,applicationId); + amazonS3Service.deleteFileFromS3(documentEntity, callId, applicationId,amendmentId); documentEntity.setIsDeleted(true); documentRepository.save(documentEntity); } @@ -142,7 +164,7 @@ public class DocumentDao { DocumentEntity documentEntity = validateDocument(documentId); String type = documentEntity.getSource(); UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = updateFileOnAmazonS3(file, DocumentSourceTypeEnum.valueOf(type), documentEntity.getSourceId()); - if (uploadFileOnAmazonS3Response != null) { + if (uploadFileOnAmazonS3Response != null) { documentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); documentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); documentEntity.setType(documentTypeEnum.getValue()); @@ -152,19 +174,28 @@ public class DocumentDao { } return callDao.convertToDocumentResponseBean(documentEntity); } + private UploadFileOnAmazonS3Response updateFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long id) { try { - Long callId; - Long applicationId; - if(type.equals(DocumentSourceTypeEnum.APPLICATION)){ + Long callId=null; + Long applicationId=null; + Long amendmentId=null; + if (type.equals(DocumentSourceTypeEnum.APPLICATION)) { callId = applicationFormRepository.findCallIdById(id); applicationId = id; - }else{ + } + else if(type.equals(DocumentSourceTypeEnum.AMENDMENT)){ + amendmentId = id; + ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId); + applicationId = applicationEntity.getId(); + callId = applicationEntity.getCall().getId(); + } + else { callId = id; applicationId = 0L; } - String s3Path = generateS3Path(type, callId, applicationId); + String s3Path = generateS3Path(type, callId, applicationId,amendmentId); log.info("Generated S3 path {}", s3Path); return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); } catch (Exception e) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java index b127b699..1db01f11 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java @@ -13,25 +13,28 @@ public class S3PathConfig { @Autowired S3ConfigRepository s3ConfigRepository; - public String generateDocumentPath(DocumentSourceTypeEnum type, Long callId, Long applicationId) { + public String generateDocumentPath(DocumentSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId) { S3ConfigEntity config = getDocumentPath(type); - return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId); + return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId,amendmentId); } - public String generateDocumentPathForOther(DocOtherSourceTypeEnum type, Long callId, Long applicationId) { + public String generateDocumentPathForOther(DocOtherSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId) { S3ConfigEntity config = getDocumentPathForOther(type); - return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId); - } - private String buildS3Path(String pathTemplate, Long callId, Long applicationId) { - - return pathTemplate.replace("{call_id}", callId != null && callId != 0L ? "call_" + callId : "").replace("{application_id}", applicationId != null && applicationId != 0L ? "application_" + applicationId : ""); + return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId,amendmentId); } public String generateDocumentPathForDelegationAndSignedDocument(DocOtherSourceTypeEnum type) { S3ConfigEntity config = getDocumentPathForOther(type); return config.getParentFolder() + "/" + config.getPath(); } + private String buildS3Path(String pathTemplate, Long callId, Long applicationId, Long amendmentId) { + return pathTemplate + .replace("{call_id}", callId != null && callId != 0L ? "call_" + callId : "") + .replace("{application_id}", applicationId != null && applicationId != 0L ? "application_" + applicationId : "") + .replace("{amendment_id}", amendmentId != null && amendmentId != 0L ? "amendment_" + amendmentId : ""); + } + private S3ConfigEntity getDocumentPath(DocumentSourceTypeEnum type) { return s3ConfigRepository.getPathByType(type.name()).orElseThrow(() -> new IllegalArgumentException("No path configuration found for type: " + type)); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java index 998c7d13..556a9949 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java @@ -6,7 +6,8 @@ public enum DocOtherSourceTypeEnum { TEMPLATE("TEMPLATE"), DELETED_USER_DELEGATION("DELETED_USER_DELEGATION"), DELETED_APPLICATION("DELETED_APPLICATION"), - DELETED_CALL("DELETED_CALL"); + DELETED_CALL("DELETED_CALL"), + DELETED_AMENDMENT("DELETED_AMENDMENT"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java index 123c6f8c..7ac28ac7 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java @@ -3,7 +3,9 @@ package net.gepafin.tendermanagement.enums; public enum DocumentSourceTypeEnum { CALL("CALL"), - APPLICATION("APPLICATION"); + APPLICATION("APPLICATION"), + + AMENDMENT("AMENDMENT"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 57331e43..9773f3ed 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.ApplicationEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; @@ -34,4 +35,12 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findByApplicationIdAndStatusInAndIsDeletedFalse(Long applicationId, List statuses); + @Query("SELECT app " + + "FROM ApplicationEntity app " + + "WHERE app.id = (SELECT aar.applicationId " + + "FROM ApplicationAmendmentRequestEntity aar " + + "WHERE aar.id = :amendmentId)") + ApplicationEntity findApplicationByAmendmentId(Long amendmentId); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java index 92cbdfab..c9de1287 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -1,5 +1,4 @@ package net.gepafin.tendermanagement.service; - import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity; import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; @@ -21,7 +20,7 @@ AmazonS3Service { InputStream getFile(String s3Folder, String filePath) throws IOException; - String generateS3PathForDeletedDocument(DocOtherSourceTypeEnum typeOfDocument, Long callId, Long applicationId); + String generateS3PathForDeletedDocument(DocOtherSourceTypeEnum typeOfDocument, Long callId, Long applicationId,Long amendmentId); String generateS3PathForDeletedDocumentForOther(); @@ -29,6 +28,6 @@ AmazonS3Service { void deleteDelegationfromS3(UserCompanyDelegationEntity userCompanyDelegationEntity); - void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId); + void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId,Long amendmentId); } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java index 5e7624ac..5c251f19 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -146,9 +146,9 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } @Override - public String generateS3PathForDeletedDocument(DocOtherSourceTypeEnum typeOfDocument, Long callId, Long applicationId) { + public String generateS3PathForDeletedDocument(DocOtherSourceTypeEnum typeOfDocument, Long callId, Long applicationId,Long amendmentId) { try { - return s3ConfigBean.generateDocumentPathForOther(typeOfDocument, callId, applicationId); + return s3ConfigBean.generateDocumentPathForOther(typeOfDocument, callId, applicationId,amendmentId); } catch (IllegalArgumentException e) { throw new CustomValidationException( Status.VALIDATION_ERROR, @@ -207,10 +207,10 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } @Override - public void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId) { + public void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId,Long amendmentId) { try { String oldS3Path = documentEntity.getFilePath(); - String newS3Path = generateS3PathForDeletedDocument(DocOtherSourceTypeEnum.valueOf("DELETED_" + documentEntity.getSource().toUpperCase()), callId, applicationId) + String newS3Path = generateS3PathForDeletedDocument(DocOtherSourceTypeEnum.valueOf("DELETED_" + documentEntity.getSource().toUpperCase()), callId, applicationId,amendmentId) + "/" + oldS3Path.substring(oldS3Path.lastIndexOf("/") + 1); String bucketUrlPrefix = getBucketUrlPrefix(); if (oldS3Path.startsWith(bucketUrlPrefix)) { @@ -224,6 +224,4 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { throw new CustomValidationException(Status.VALIDATION_ERROR, "Error occurred while moving file to deleted folder."); } } - - } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java index 4bc59150..eefe4706 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java @@ -164,10 +164,10 @@ public class S3ReUploadMigrationService { Long callId; if (sourceType.equals(DocumentSourceTypeEnum.CALL)) { - return s3ConfigBean.generateDocumentPath(sourceType, document.getSourceId(), 0L); + return s3ConfigBean.generateDocumentPath(sourceType, document.getSourceId(), 0L,0L); } else { callId = applicationRepository.findCallIdById(document.getSourceId()); - return s3ConfigBean.generateDocumentPath(sourceType, callId, document.getSourceId()); + return s3ConfigBean.generateDocumentPath(sourceType, callId, document.getSourceId(),0L); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java index dbd54afd..d66f9aaa 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java @@ -130,7 +130,7 @@ public class UserSignedAndDelegationServiceImpl { private String generateNewS3PathForDelegationDoc() { - return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L); + return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L,0L); } private String generateNewS3PathForUserSignedDoc(ApplicationSignedDocumentEntity document) { 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 ea473da2..3c41c899 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 @@ -1803,4 +1803,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +