From 202e9604a8d26e1af618539694b6168539760d4f Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 26 Nov 2024 17:07:25 +0530 Subject: [PATCH 1/2] Deleted Documents --- .../tendermanagement/dao/DelegationDao.java | 1 + .../tendermanagement/dao/DocumentDao.java | 44 +++++--- .../enums/DocOtherSourceTypeEnum.java | 5 +- .../service/AmazonS3Service.java | 18 +++- .../service/impl/AmazonS3ServiceImpl.java | 101 ++++++++++++++++++ 5 files changed, 152 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index dfc65ec7..3fd9d83f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -255,6 +255,7 @@ public class DelegationDao { throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DELEGATION_NOT_FOUND)); } + amazonS3Service.deleteDelegationfromS3(userCompanyDelegationEntity); userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.INACTIVE.getValue()); userCompanyDelegationRepository.save(userCompanyDelegationEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 6f8e3243..1ccd9386 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -1,30 +1,29 @@ package net.gepafin.tendermanagement.dao; - -import java.util.stream.Collectors; - import lombok.extern.slf4j.Slf4j; -import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; -import net.gepafin.tendermanagement.repositories.ApplicationRepository; -import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; +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.ApplicationRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.service.AmazonS3Service; +import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; - +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Slf4j @Component @@ -47,6 +46,14 @@ public class DocumentDao { @Autowired private ApplicationRepository applicationFormRepository; + + @Autowired + ApplicationService applicationService; + + @Value("${aws.s3.bucket.name}") + private String bucketName; + + // @Value("${aws.s3.url.folder}") // private String s3Folder; @@ -110,13 +117,22 @@ public class DocumentDao { public void deleteFile(Long documentId) { DocumentEntity documentEntity = validateDocument(documentId); -// String fileName= Utils.extractFileName(documentEntity.getFilePath()); -// deleteFileOnAmazonS3(fileName); + Long callId = null; + Long applicationId = null; + + if ("CALL".equalsIgnoreCase(documentEntity.getSource())) { + callId = documentEntity.getSourceId(); + } else if ("APPLICATION".equalsIgnoreCase(documentEntity.getSource())) { + applicationId = documentEntity.getSourceId(); + ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); + callId = applicationEntity.getCall().getId(); + } + + amazonS3Service.deleteFileFromS3(documentEntity,callId,applicationId); documentEntity.setIsDeleted(true); documentRepository.save(documentEntity); } - public DocumentEntity validateDocument(Long id) { return documentRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java index 751dfa92..998c7d13 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java @@ -3,7 +3,10 @@ package net.gepafin.tendermanagement.enums; public enum DocOtherSourceTypeEnum { USER_SIGNED_DOCUMENT("USER_SIGNED_DOCUMENT"), USER_DELEGATION("USER_DELEGATION"), - TEMPLATE("TEMPLATE"); + TEMPLATE("TEMPLATE"), + DELETED_USER_DELEGATION("DELETED_USER_DELEGATION"), + DELETED_APPLICATION("DELETED_APPLICATION"), + DELETED_CALL("DELETED_CALL"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java index 6cc27000..92cbdfab 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -1,5 +1,8 @@ package net.gepafin.tendermanagement.service; +import net.gepafin.tendermanagement.entities.DocumentEntity; +import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -9,12 +12,23 @@ import java.io.IOException; import java.io.InputStream; @Component -public interface AmazonS3Service { +public interface +AmazonS3Service { UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file); Boolean delete(String s3Folder, String filePath); InputStream getFile(String s3Folder, String filePath) throws IOException; - + + String generateS3PathForDeletedDocument(DocOtherSourceTypeEnum typeOfDocument, Long callId, Long applicationId); + + String generateS3PathForDeletedDocumentForOther(); + + void moveFile(String bucketName, String oldPath, String newPath); + + void deleteDelegationfromS3(UserCompanyDelegationEntity userCompanyDelegationEntity); + + void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId); + } \ 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 56141be2..5e7624ac 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -1,10 +1,17 @@ package net.gepafin.tendermanagement.service.impl; +import com.amazonaws.AmazonServiceException; +import com.amazonaws.SdkClientException; import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.*; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.dao.S3PathConfig; +import net.gepafin.tendermanagement.entities.DocumentEntity; +import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.util.Utils; @@ -45,6 +52,18 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { @Value("${aws.s3.url}") private String s3Url; + @Autowired + private S3PathConfig s3ConfigBean; + + @Autowired + private AmazonS3Client s3Client; + + @Value("${aws.s3.region}") + private String region; + + private String getBucketUrlPrefix() { + return "https://" + bucketName + ".s3." + region + ".amazonaws.com/"; + } private String upload(String fileName, String s3Folder, MultipartFile file) throws IOException { @@ -125,4 +144,86 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); } } + + @Override + public String generateS3PathForDeletedDocument(DocOtherSourceTypeEnum typeOfDocument, Long callId, Long applicationId) { + try { + return s3ConfigBean.generateDocumentPathForOther(typeOfDocument, callId, applicationId); + } catch (IllegalArgumentException e) { + throw new CustomValidationException( + Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG) + ); + } + } + + @Override + public String generateS3PathForDeletedDocumentForOther() { + try { + return s3ConfigBean.generateDocumentPathForDelegationAndSignedDocument(DocOtherSourceTypeEnum.DELETED_USER_DELEGATION); + } catch (IllegalArgumentException e) { + throw new CustomValidationException( + Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG) + ); + } + } + + @Override + public void moveFile(String bucketName, String oldPath, String newPath) { + try { + log.info("Moving file from {} to {} in bucket {}", oldPath, newPath, bucketName); + + CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, oldPath, bucketName, newPath); + s3Client.copyObject(copyRequest); + log.info("File copied successfully from {} to {}", oldPath, newPath); + + s3Client.deleteObject(bucketName, oldPath); + log.info("Original file deleted successfully: {}", oldPath); + } catch (AmazonServiceException e) { + log.error("AWS service error while moving file: {}", e.getErrorMessage(), e); + throw e; + } catch (SdkClientException e) { + log.error("SDK client error while moving file: {}", e.getMessage(), e); + throw e; + } catch (Exception e) { + log.error("Unexpected error while moving file: {}", e.getMessage(), e); + throw e; + } + } + + @Override + public void deleteDelegationfromS3(UserCompanyDelegationEntity userCompanyDelegationEntity) { + String oldS3Path = userCompanyDelegationEntity.getFilePath(); + String newS3Path = generateS3PathForDeletedDocumentForOther() + + "/" + oldS3Path.substring(oldS3Path.lastIndexOf("/") + 1); + + String bucketUrlPrefix = getBucketUrlPrefix(); + if (oldS3Path.startsWith(bucketUrlPrefix)) { + oldS3Path = oldS3Path.replace(bucketUrlPrefix, ""); + } + moveFile(bucketName, oldS3Path, newS3Path); + log.info("File for company ID {} successfully moved to deleted folder.", userCompanyDelegationEntity.getId()); + } + + @Override + public void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId) { + try { + String oldS3Path = documentEntity.getFilePath(); + String newS3Path = generateS3PathForDeletedDocument(DocOtherSourceTypeEnum.valueOf("DELETED_" + documentEntity.getSource().toUpperCase()), callId, applicationId) + + "/" + oldS3Path.substring(oldS3Path.lastIndexOf("/") + 1); + String bucketUrlPrefix = getBucketUrlPrefix(); + if (oldS3Path.startsWith(bucketUrlPrefix)) { + oldS3Path = oldS3Path.replace(bucketUrlPrefix, ""); + } + + moveFile(bucketName, oldS3Path, newS3Path); + log.info("File for document ID {} successfully moved to deleted folder.", documentEntity.getId()); + } catch (Exception e) { + log.error("Error moving file for document ID {} to deleted folder: {}", documentEntity.getId(), e.getMessage()); + throw new CustomValidationException(Status.VALIDATION_ERROR, "Error occurred while moving file to deleted folder."); + } + } + + } \ No newline at end of file From d21445be38fafe4a5ef1371dc67928ea88075911 Mon Sep 17 00:00:00 2001 From: nishainnogent Date: Thu, 28 Nov 2024 12:17:31 +0530 Subject: [PATCH 2/2] Amendment Documents --- .../tendermanagement/dao/ApplicationDao.java | 6 +- .../gepafin/tendermanagement/dao/CallDao.java | 2 +- .../tendermanagement/dao/DelegationDao.java | 2 +- .../tendermanagement/dao/DocumentDao.java | 59 ++++++++++++++----- .../tendermanagement/dao/S3PathConfig.java | 19 +++--- .../enums/DocOtherSourceTypeEnum.java | 3 +- .../enums/DocumentSourceTypeEnum.java | 4 +- ...ApplicationAmendmentRequestRepository.java | 9 +++ .../service/AmazonS3Service.java | 5 +- .../service/impl/AmazonS3ServiceImpl.java | 10 ++-- .../impl/S3ReUploadMigrationService.java | 4 +- .../UserSignedAndDelegationServiceImpl.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 48 +++++++++++++++ 13 files changed, 132 insertions(+), 41 deletions(-) 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +