S3ObjectStorageClient.java

package com.hwhub.backend.infrastructure.s3;

import com.hwhub.backend.domain.storage.ObjectStorageClient;
import java.net.URL;
import java.time.Duration;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;

public class S3ObjectStorageClient implements ObjectStorageClient {

  private final S3Client s3Client;
  private final S3Presigner presigner;

  public S3ObjectStorageClient(S3Client s3Client, S3Presigner presigner) {
    this.s3Client = s3Client;
    this.presigner = presigner;
  }

  @Override
  public URL createPresignedPutUrl(String bucket, String key, String contentType, Duration ttl) {

    PutObjectRequest putObjectRequest =
        PutObjectRequest.builder().bucket(bucket).key(key).contentType(contentType).build();

    PutObjectPresignRequest presignRequest =
        PutObjectPresignRequest.builder()
            .signatureDuration(ttl)
            .putObjectRequest(putObjectRequest)
            .build();

    return presigner.presignPutObject(presignRequest).url();
  }

  @Override
  public URL createPresignedGetUrl(String bucket, String key, Duration ttl) {

    GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(bucket).key(key).build();

    GetObjectPresignRequest presignRequest =
        GetObjectPresignRequest.builder()
            .signatureDuration(ttl)
            .getObjectRequest(getObjectRequest)
            .build();

    return presigner.presignGetObject(presignRequest).url();
  }

  @Override
  public void deleteObject(String bucket, String key) {
    DeleteObjectRequest request = DeleteObjectRequest.builder().bucket(bucket).key(key).build();

    s3Client.deleteObject(request);
  }
}