MinioObjectStorage.java
package com.ecommerce.catalog.infrastructure.storage;
import com.ecommerce.catalog.application.exception.CatalogError;
import com.ecommerce.catalog.application.exception.CatalogException;
import com.ecommerce.catalog.application.port.ObjectStorage;
import io.minio.GetPresignedObjectUrlArgs;
import io.minio.Http.Method;
import io.minio.MinioClient;
import io.minio.StatObjectArgs;
import io.minio.StatObjectResponse;
import org.springframework.stereotype.Component;
import java.time.Duration;
@Component
public class MinioObjectStorage implements ObjectStorage {
private final MinioClient minioClient;
public MinioObjectStorage(MinioClient minioClient) {
this.minioClient = minioClient;
}
@Override
public String createUploadUrl(String bucket, String objectKey, Duration expiry) {
return presignedUrl(Method.PUT, bucket, objectKey, expiry);
}
@Override
public String createDownloadUrl(String bucket, String objectKey, Duration expiry) {
return presignedUrl(Method.GET, bucket, objectKey, expiry);
}
@Override
public StoredObject stat(String bucket, String objectKey) {
try {
StatObjectResponse response = minioClient.statObject(StatObjectArgs.builder()
.bucket(bucket)
.object(objectKey)
.build());
return new StoredObject(response.size(), response.contentType());
} catch (Exception exception) {
throw new CatalogException(CatalogError.MEDIA_STORAGE_UNAVAILABLE, exception);
}
}
private String presignedUrl(Method method, String bucket, String objectKey, Duration expiry) {
try {
return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(method)
.bucket(bucket)
.object(objectKey)
.expiry(Math.toIntExact(expiry.toSeconds()))
.build());
} catch (Exception exception) {
throw new CatalogException(CatalogError.MEDIA_STORAGE_UNAVAILABLE, exception);
}
}
}