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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Optional; @Service public class AmazonS3ServiceImpl implements AmazonS3Service { private final Logger log = LoggerFactory.getLogger(AmazonS3ServiceImpl.class); @Autowired private AmazonS3 amazonS3; @Autowired private Environment environment; @Value("${aws.s3.bucket.name}") private String bucketName; @Value("${aws.s3.url}") private String s3Url; private String upload(String fileName, String s3Folder, MultipartFile file) throws IOException { String path = s3Folder +"/"+fileName; InputStream inputStream = file.getInputStream(); ObjectMetadata objectMetadata = new ObjectMetadata(); Map metadata = new HashMap<>(); metadata.put("Content-Type", file.getContentType()); metadata.put("Content-Length", String.valueOf(file.getSize())); Optional> optionalMetaData = Optional.of(metadata); optionalMetaData.ifPresent(map -> { if (!map.isEmpty()) { map.forEach(objectMetadata::addUserMetadata); } }); if(Boolean.FALSE.equals(isTestProfileActivated())) { amazonS3.putObject(bucketName, path, inputStream, objectMetadata); } path =s3Url + s3Folder +"/"+ fileName; log.info("File '{}' uploaded successfully to Amazon S3 with URL: {}", fileName, path); return path; } @Override public Boolean delete(String s3Folder, String filePath) { String fileName = Utils.extractFileName(filePath); String path = s3Folder +"/"+fileName; final DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucketName, path); if(Boolean.FALSE.equals(isTestProfileActivated())) { amazonS3.deleteObject(deleteObjectRequest); } log.info("File '{}' deleted successfully from Amazon S3", fileName); return true; } public Boolean isTestProfileActivated() { String[] activeProfiles = environment.getActiveProfiles(); return Arrays.stream(activeProfiles).anyMatch("test"::equals); } @Override public InputStream getFile(String s3Folder, String filePath) { try { String fileName = Utils.extractFileName(filePath); String path = s3Folder + "/" + fileName; GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, path); S3Object s3Object = amazonS3.getObject(getObjectRequest); log.info("File fetched successfully from Amazon S3: {}", fileName); return s3Object.getObjectContent(); } catch (AmazonS3Exception e) { log.error("Error occurred while getting file from Amazon S3: {}", e); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.GET_ERROR_S3)); } } @Override public UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file) { String extension = FilenameUtils.getExtension(file.getOriginalFilename()); String originalFileName = org.springframework.util.StringUtils.cleanPath(file.getOriginalFilename()); String firstNameContain = originalFileName.substring(0, originalFileName.lastIndexOf('.')); firstNameContain = Utils.replaceSpacesWithUnderscores(firstNameContain); firstNameContain += "_" + Utils.randomKey(7); String fileName = (firstNameContain + "." + extension); try { String filepath = upload(fileName, s3Folder, file); return UploadFileOnAmazonS3Response.builder().fileName(originalFileName).filePath(filepath).build(); } catch (Exception e) { log.error("Error occurred while uploading file from Amazon S3: {}", e); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); } } }