From eb12433a31ba54fcdd57af4b128fedef3125ff58 Mon Sep 17 00:00:00 2001 From: rajesh Date: Sat, 12 Oct 2024 14:47:05 +0530 Subject: [PATCH] Done ticket GEPAFINBE-41 --- .../constants/GepafinConstant.java | 3 + .../tendermanagement/dao/ApplicationDao.java | 81 ++++++++++++++++++- .../ApplicationSignedDocumentEntity.java | 28 +++++++ .../ApplicationSignedDocumentStatusEnum.java | 18 +++++ .../ApplicationSignedDocumentResponse.java | 14 ++++ .../response/CompanyDelegationResponse.java | 3 +- .../UploadFileOnAmazonS3Response.java | 14 ++++ .../ApplicationSignedDocumentRepository.java | 13 +++ .../service/AmazonS3Service.java | 4 + .../service/ApplicationService.java | 7 ++ .../service/impl/AmazonS3ServiceImpl.java | 25 ++++++ .../service/impl/ApplicationServiceImpl.java | 16 +++- .../service/impl/CompanyServiceImpl.java | 3 +- .../tendermanagement/util/Validator.java | 5 +- .../web/rest/api/ApplicationApi.java | 27 +++++++ .../api/impl/ApplicationApiController.java | 22 +++++ src/main/resources/application.properties | 1 + .../db/changelog/db.changelog-1.0.0.xml | 25 ++++++ src/main/resources/message_en.properties | 3 + src/main/resources/message_it.properties | 3 + 20 files changed, 307 insertions(+), 8 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationSignedDocumentEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/ApplicationSignedDocumentStatusEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationSignedDocumentResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/UploadFileOnAmazonS3Response.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 9fdb1936..4580af18 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -204,5 +204,8 @@ public class GepafinConstant { public static final String CALL_DOCUMENTS_FETCH_SUCCESS_MSG = "call.documents.fetch.success"; public static final String CALL_DOCUMENTS_NOT_FOUND_MSG = "call.documents.not.found"; public static final String PERMISSION_DENIED = "permission.denied"; + public static final String SIGNED_DOCUMENT_FILE_UPLOAD_SUCCESS = "signed.document.file.upload.success"; + public static final String GET_SIGNED_DOCUMENT_FILE_SUCCESS = "get.signed.document.file.success"; + public static final String APPLICATION_SIGNED_DOCUMENT_NOT_FOUND = "application.signed.document.not.found"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 634594ba..c12f6d4e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -3,6 +3,7 @@ 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.ApplicationSignedDocumentStatusEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum; @@ -12,6 +13,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; +import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.DocumentService; @@ -26,10 +28,13 @@ 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.beans.factory.annotation.Value; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; import jakarta.persistence.criteria.Predicate; +import jakarta.servlet.http.HttpServletRequest; import java.text.MessageFormat; import java.time.LocalDateTime; @@ -71,17 +76,27 @@ public class ApplicationDao { @Autowired private FlowDataRepository flowDataRepository; - @Autowired - private UserWithCompanyRepository userWithCompanyRepository; + @Autowired private UserCompanyDelegationRepository userCompanyDelegationRepository; + @Autowired private Validator validator; + @Autowired private CompanyService companyService; @Autowired private ProtocolRepository protocolRepository; + + @Autowired + private AmazonS3Service amazonS3Service; + + @Autowired + private ApplicationSignedDocumentRepository applicationSignedDocumentRepository; + + @Value("${aws.s3.url.folder.signed.document}") + private String signedDocumentS3Folder; public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId, Long applicationId) { @@ -663,4 +678,66 @@ public class ApplicationDao { protocolRepository.save(protocolEntity); return protocolEntity; } + + public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId, + MultipartFile file) { + ApplicationEntity applicationEntity = validateApplication(applicationId); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); + validateFileType(file); + ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository + .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); + if (applicationSignedDocument != null) { + applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); + applicationSignedDocumentRepository.save(applicationSignedDocument); + } + UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = amazonS3Service.uploadFileOnAmazonS3(signedDocumentS3Folder, + file); + applicationSignedDocument = new ApplicationSignedDocumentEntity(); + applicationSignedDocument.setApplication(applicationEntity); + applicationSignedDocument.setFileName(uploadFileOnAmazonS3.getFileName()); + applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath()); + applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); + applicationSignedDocumentRepository.save(applicationSignedDocument); + return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument); + } + + private ApplicationSignedDocumentResponse convertApplicationSignedDocumentToApplicationSignedDocumentResponse( + ApplicationSignedDocumentEntity applicationSignedDocument) { + ApplicationSignedDocumentResponse applicationSignedDocumentResponse = new ApplicationSignedDocumentResponse(); + applicationSignedDocumentResponse.setId(applicationSignedDocument.getId()); + applicationSignedDocumentResponse.setApplicationId(applicationSignedDocument.getApplication().getId()); + applicationSignedDocumentResponse.setFileName(applicationSignedDocument.getFileName()); + applicationSignedDocumentResponse.setFilePath(applicationSignedDocument.getFilePath()); + applicationSignedDocumentResponse + .setStatus(ApplicationSignedDocumentStatusEnum.valueOf(applicationSignedDocument.getStatus())); + applicationSignedDocumentResponse.setCreatedDate(applicationSignedDocument.getCreatedDate()); + applicationSignedDocumentResponse.setUpdatedDate(applicationSignedDocument.getUpdatedDate()); + return applicationSignedDocumentResponse; + } + + private void validateFileType(MultipartFile file) { + if (file.isEmpty()) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.VALIDATION_ERROR_FILE_EMPTY)); + } + String filename = file.getOriginalFilename(); + if (filename == null || !filename.endsWith(".p7m")) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.VALIDATION_ERROR_FILE_INVALIDTYPE)); + } + } + + public ApplicationSignedDocumentResponse getSignedDocument(HttpServletRequest request, Long applicationId) { + + ApplicationEntity applicationEntity = validateApplication(applicationId); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); + + ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository + .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); + if(applicationSignedDocument == null) { + throw new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_SIGNED_DOCUMENT_NOT_FOUND)); + } + return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationSignedDocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationSignedDocumentEntity.java new file mode 100644 index 00000000..58975cca --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationSignedDocumentEntity.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Data; + +@Data +@Entity +@Table(name = "application_signed_document") +public class ApplicationSignedDocumentEntity extends BaseEntity { + + @ManyToOne + @JoinColumn(name = "APPLICATION_ID") + private ApplicationEntity application; + + @Column(name = "FILE_NAME") + private String fileName; + + @Column(name = "FILE_PATH") + private String filePath; + + @Column(name="STATUS") + private String status; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationSignedDocumentStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationSignedDocumentStatusEnum.java new file mode 100644 index 00000000..c0064d87 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationSignedDocumentStatusEnum.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum ApplicationSignedDocumentStatusEnum { + ACTIVE("ACTIVE"), INACTIVE("INACTIVE"); + + private String value; + + ApplicationSignedDocumentStatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationSignedDocumentResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationSignedDocumentResponse.java new file mode 100644 index 00000000..64b380f5 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationSignedDocumentResponse.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationSignedDocumentStatusEnum; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class ApplicationSignedDocumentResponse extends BaseBean{ + + private Long applicationId; + private String fileName; + private String filePath; + private ApplicationSignedDocumentStatusEnum status; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDelegationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDelegationResponse.java index 7c23b3b8..f1b69b33 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDelegationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDelegationResponse.java @@ -3,9 +3,10 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; import net.gepafin.tendermanagement.entities.BaseEntity; import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum; +import net.gepafin.tendermanagement.model.BaseBean; @Data -public class CompanyDelegationResponse extends BaseEntity{ +public class CompanyDelegationResponse extends BaseBean{ private Long userId; private Long companyId; private Long beneficiaryId; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/UploadFileOnAmazonS3Response.java b/src/main/java/net/gepafin/tendermanagement/model/response/UploadFileOnAmazonS3Response.java new file mode 100644 index 00000000..d0d78428 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/UploadFileOnAmazonS3Response.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class UploadFileOnAmazonS3Response { + + private String fileName; + + private String filePath; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java new file mode 100644 index 00000000..35322a6a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.gepafin.tendermanagement.entities.ApplicationSignedDocumentEntity; + +@Repository +public interface ApplicationSignedDocumentRepository extends JpaRepository { + + ApplicationSignedDocumentEntity findByApplicationIdAndStatus(Long applicationId, String status); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java index ce34cd7d..ea3937a3 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -3,6 +3,8 @@ package net.gepafin.tendermanagement.service; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; +import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; + import java.io.IOException; import java.io.InputStream; @@ -14,4 +16,6 @@ public interface AmazonS3Service { public Boolean delete(String s3Folder, String fileName); InputStream getFile(String s3Folder, String filePath) throws IOException; + + public UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file); } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index edb62c93..d05ee2eb 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -9,10 +9,13 @@ import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import java.util.List; +import org.springframework.web.multipart.MultipartFile; + public interface ApplicationService { public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean,Long applicationId, Long formId); @@ -31,4 +34,8 @@ public interface ApplicationService { public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status); + public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId, MultipartFile file); + + public ApplicationSignedDocumentResponse getSignedDocument(HttpServletRequest request, Long applicationId); + } 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 756e4360..a0470c15 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -2,7 +2,16 @@ package net.gepafin.tendermanagement.service.impl; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.*; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; import net.gepafin.tendermanagement.service.AmazonS3Service; +import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; + +import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; @@ -86,4 +95,20 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { throw new IOException("Error getting file from Amazon S3", e); } } + + @Override + public UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file) { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + String fileName = org.springframework.util.StringUtils.cleanPath(file.getOriginalFilename()); + String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); + firstNameContain+=Utils.randomKey(5); + fileName = (firstNameContain + "." + extension); + try { + String filepath = upload(fileName, s3Folder, file); + return UploadFileOnAmazonS3Response.builder().fileName(fileName).filePath(filepath).build(); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index a082a092..56658ee3 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -13,12 +13,14 @@ import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; 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 org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -64,7 +66,7 @@ public class ApplicationServiceImpl implements ApplicationService { @Transactional(rollbackFor = Exception.class) public ApplicationResponse createApplication(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId) { UserEntity userEntity = validator.validateUser(request); - CompanyEntity companyEntity = validator.validateUSerWithCompany(request, companyId); + CompanyEntity companyEntity = validator.validateUserWithCompany(request, companyId); return applicationDao.createApplicationByCallId(companyEntity, applicationRequest, callId, userEntity); } @@ -87,8 +89,18 @@ public class ApplicationServiceImpl implements ApplicationService { public List getAllApplications(HttpServletRequest request, Long callId, Long companyId) { UserEntity userEntity = validator.validateUser(request); if (companyId != null) { - validator.validateUSerWithCompany(request, companyId); + validator.validateUserWithCompany(request, companyId); } return applicationDao.getAllApplications(userEntity, callId, companyId); } + @Override + @Transactional(rollbackFor = Exception.class) + public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId, MultipartFile file) { + return applicationDao.uploadSignedDocument(request, applicationId, file); + } + + @Override + public ApplicationSignedDocumentResponse getSignedDocument(HttpServletRequest request, Long applicationId) { + return applicationDao.getSignedDocument(request, applicationId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java index 1f80b223..033ddba3 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -98,7 +98,8 @@ public class CompanyServiceImpl implements CompanyService { @Override @Transactional(rollbackFor = Exception.class) public CompanyDelegationResponse uploadCompanyDelegation(HttpServletRequest request, Long companyId, MultipartFile file) { - UserEntity userEntity =validator.validateUser(request); + UserEntity userEntity = validator.validateUser(request); + validator.validateUserWithCompany(request, companyId); return delegationDao.uploadCompanyDelegation(userEntity, companyId, file); } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index e123988a..bb7d4053 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -9,6 +9,7 @@ import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.web.rest.api.errors.ForbiddenAccessException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.UnauthorizedAccessException; @@ -60,7 +61,7 @@ public class Validator { } } - public CompanyEntity validateUSerWithCompany(HttpServletRequest request, Long companyId) { + public CompanyEntity validateUserWithCompany(HttpServletRequest request, Long companyId) { if (checkIsSuperAdmin()) { return companyService.validateCompany(companyId); } @@ -89,7 +90,7 @@ public class Validator { public UserEntity validateUserId(HttpServletRequest request, Long userId) { UserEntity user = validateUser(request); if(user.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()) && Boolean.FALSE.equals(user.getId().equals(userId))) { - throw new UnauthorizedAccessException(Status.UNAUTHORIZED, Translator.toLocale(GepafinConstant.INVALID_REQUEST)); + throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); } return userService.validateUser(userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index 1869655c..eee93d90 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -6,6 +6,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -21,6 +22,8 @@ import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; +import net.gepafin.tendermanagement.model.response.CompanyDelegationResponse; import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -131,6 +134,30 @@ public interface ApplicationApi { @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId, @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) ApplicationStatusTypeEnum status); + @Operation(summary = "Api to upload signed document (only p7m file format is supported)", 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) })) }) + @PostMapping(value = "{applicationId}/signedDocument/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + ResponseEntity> uploadSignedDocument(HttpServletRequest request, + @Parameter(description = "The applicationId id", required = true) @PathVariable("applicationId") Long applicationId, + @Parameter(description = "The signed document", required = true) @RequestParam("file") MultipartFile file); + + + @Operation(summary = "Api to get signed document", 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}/signedDocument", produces = "application/json") + ResponseEntity> getSignedDocument(HttpServletRequest request, + @Parameter(description = "The applicationId id", required = true) @PathVariable("applicationId") Long applicationId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index bcbf8e80..b79196c3 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -10,6 +10,8 @@ import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; +import net.gepafin.tendermanagement.model.response.CompanyDelegationResponse; import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationService; @@ -21,6 +23,7 @@ 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.springframework.web.multipart.MultipartFile; import org.slf4j.Logger; import java.util.List; @@ -89,4 +92,23 @@ public class ApplicationApiController implements ApplicationApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY))); } + + @Override + public ResponseEntity> uploadSignedDocument(HttpServletRequest request, + Long applicationId, MultipartFile file) { + log.info("upload signed document applicationId: {}", applicationId); + ApplicationSignedDocumentResponse response = applicationService.uploadSignedDocument(request, applicationId, file); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.SIGNED_DOCUMENT_FILE_UPLOAD_SUCCESS))); + } + + @Override + public ResponseEntity> getSignedDocument(HttpServletRequest request, + Long applicationId) { + ApplicationSignedDocumentResponse response = applicationService.getSignedDocument(request, applicationId); + log.info("get signed document applicationId: {}", applicationId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_SIGNED_DOCUMENT_FILE_SUCCESS))); + } + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 27151cbc..175c7e6c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -32,6 +32,7 @@ aws.s3.bucket.name=mementoresources aws.s3.url = https://mementoresources.s3.eu-west-1.amazonaws.com/ aws.s3.url.folder=gepafin aws.s3.url.folder.delegation=gepafin/delegation +aws.s3.url.folder.signed.document=gepafin/signed-document # JWT configuration # Ensure these values match your expectations security.authentication.jwt.secret=my-secret-token-to-change-in-prod-environment-your-super-secure-randomly-generated-key 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 98016d3c..a1369e93 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 @@ -973,4 +973,29 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index bbf010f5..49208615 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -230,5 +230,8 @@ application.submitted.cannot.change=The submitted application cannot be changed. call.documents.fetch.success=Documents fetched successfully. call.documents.not.found=No documents found for the specified call. permission.denied=You are not authorized to access this data. +signed.document.file.upload.success=Signed document file uploaded successfully. +get.signed.document.file.success=Signed document file retrieved successfully. +application.signed.document.not.found=Signed document for the application not found. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 2235bb51..7fe8f0ff 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -226,5 +226,8 @@ application.submitted.cannot.change=La domanda inviata non pu call.documents.fetch.success=Documenti recuperati con successo. call.documents.not.found=Nessun documento trovato per la chiamata specificata. permission.denied=Non sei autorizzato ad accedere a questi dati. +signed.document.file.upload.success=File del documento firmato caricato con successo. +get.signed.document.file.success=File del documento firmato recuperato con successo. +application.signed.document.not.found=Documento firmato per l'applicazione non trovato.