S3Facade.kt
package io.github.lishangbu.avalon.s3.facade
import io.github.lishangbu.avalon.s3.properties.S3Provider
import software.amazon.awssdk.services.s3.S3AsyncClient
import software.amazon.awssdk.services.s3.S3Client
import software.amazon.awssdk.services.s3.presigner.S3Presigner
import software.amazon.awssdk.services.s3.waiters.S3Waiter
import software.amazon.awssdk.services.s3control.S3ControlAsyncClient
import software.amazon.awssdk.services.s3control.S3ControlClient
import software.amazon.awssdk.transfer.s3.S3TransferManager
/**
* 一个命名 S3 client 的能力聚合视图。
*
* 所有 AWS 原生能力都可以通过原生 client 访问,常用数据面操作通过 facade 访问。
*/
class S3Facade(
val clientName: String,
val provider: S3Provider,
private val bucketAliases: Map<String, String>,
val s3Client: S3Client,
val s3AsyncClient: S3AsyncClient,
val s3Waiter: S3Waiter,
val s3Presigner: S3Presigner,
val s3ControlClient: S3ControlClient,
val s3ControlAsyncClient: S3ControlAsyncClient,
val s3TransferManager: S3TransferManager,
) {
/** 存储桶相关操作。 */
val buckets: BucketOperations = BucketOperations(s3Client, s3Waiter, ::resolveBucketName)
/** 对象相关操作。 */
val objects: ObjectOperations = ObjectOperations(s3Client, ::resolveBucketName)
/** Multipart 相关操作。 */
val multipart: MultipartOperations = MultipartOperations(s3Client, ::resolveBucketName)
/** 预签名相关操作。 */
val presign: PresignOperations = PresignOperations(s3Presigner, ::resolveBucketName)
/** Transfer Manager 相关操作。 */
val transfer: TransferOperations = TransferOperations(s3TransferManager, ::resolveBucketName)
/** 将桶别名解析成真实桶名。 */
fun resolveBucketName(bucketNameOrAlias: String): String = bucketAliases[bucketNameOrAlias] ?: bucketNameOrAlias
}