S3StorageConfiguration.java

package com.wilzwert.myjobs.infrastructure.storage;


import com.wilzwert.myjobs.core.domain.shared.ports.driven.FileStorage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;

/**
 * @author Wilhelm Zwertvaegher
 */

@Configuration
@Profile({"integration", "staging", "prod"})
public class S3StorageConfiguration {

    @Value("${aws.s3.bucket-name}")
    private String bucketName;

    @Value("${aws.s3.region}")
    private String region;

    @Value("${aws.s3.access-key-id}")
    private String accessKeyId;

    @Value("${aws.s3.secret-access-key}")
    private String accessKeySecret;

    @Bean
    AwsBasicCredentials awsBasicCredentials() {
        return AwsBasicCredentials.create(accessKeyId, accessKeySecret);
    }

    @Bean
    public S3Client s3Client(AwsBasicCredentials awsBasicCredentials) {
        return S3Client.builder()
                .credentialsProvider(StaticCredentialsProvider.create(awsBasicCredentials))
                .region(Region.of(region))
                .build();
    }

    @Bean
    public S3Presigner s3Presigner(AwsBasicCredentials awsBasicCredentials) {
        return S3Presigner.builder()
                .credentialsProvider(StaticCredentialsProvider.create(awsBasicCredentials))
                .region(Region.of(region))
                .build();
    }

    @Bean
    public FileStorage fileStorage(S3Client s3Client, S3Presigner s3Presigner, SecureTempFileHelper secureTempFileHelper) {
        return new S3FileStorage(s3Client, s3Presigner, bucketName, secureTempFileHelper);
    }
}