diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift index 5153e90c89..b935df2dd0 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift @@ -34,6 +34,7 @@ class AWSS3PreSignedURLBuilderAdapter: AWSS3PreSignedURLBuilderBehavior { /// - Returns: Pre-Signed URL func getPreSignedURL(key: String, signingOperation: AWSS3SigningOperation, + metadata: [String: String]? = nil, accelerate: Bool? = nil, expires: Int64? = nil) async throws -> URL { let expiresDate = Date(timeIntervalSinceNow: Double(expires ?? defaultExpiration)) @@ -47,7 +48,7 @@ class AWSS3PreSignedURLBuilderAdapter: AWSS3PreSignedURLBuilderBehavior { config: config, expiration: expiration) case .putObject: - let input = PutObjectInput(bucket: bucket, key: key) + let input = PutObjectInput(bucket: bucket, key: key, metadata: metadata) preSignedUrl = try await input.presignURL( config: config, expiration: expiration) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift index dddc19ed44..7ca3f989cb 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift @@ -41,6 +41,7 @@ protocol AWSS3PreSignedURLBuilderBehavior { /// - Tag: AWSS3PreSignedURLBuilderBehavior.getPreSignedURL func getPreSignedURL(key: String, signingOperation: AWSS3SigningOperation, + metadata: [String: String]?, accelerate: Bool?, expires: Int64?) async throws -> URL diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift index c4893c86c9..ab7c5849de 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift @@ -30,6 +30,7 @@ extension AWSS3StorageService { do { let preSignedURL = try await preSignedURLBuilder.getPreSignedURL(key: serviceKey, signingOperation: .getObject, + metadata: nil, accelerate: accelerate, expires: nil) startDownload(preSignedURL: preSignedURL, transferTask: transferTask) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift index b13c4a25f6..fc3eb40699 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift @@ -14,11 +14,13 @@ extension AWSS3StorageService { func getPreSignedURL(serviceKey: String, signingOperation: AWSS3SigningOperation, + metadata: [String: String]?, accelerate: Bool?, expires: Int) async throws -> URL { return try await preSignedURLBuilder.getPreSignedURL( key: serviceKey, signingOperation: signingOperation, + metadata: metadata, accelerate: nil, expires: Int64(expires) ) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift index 7bff9e94ba..5349e4a6be 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift @@ -36,6 +36,7 @@ extension AWSS3StorageService { do { let preSignedURL = try await preSignedURLBuilder.getPreSignedURL(key: serviceKey, signingOperation: .putObject, + metadata: metadata, accelerate: accelerate, expires: nil) startUpload(preSignedURL: preSignedURL, diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift index 8226df07ff..21ae5df171 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift @@ -44,6 +44,7 @@ protocol AWSS3StorageServiceBehavior { func getPreSignedURL(serviceKey: String, signingOperation: AWSS3SigningOperation, + metadata: [String: String]?, accelerate: Bool?, expires: Int) async throws -> URL diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift index 7bedf97def..4c1e83eb40 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift @@ -135,6 +135,7 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { let preSignedURL = try await serviceProxy.preSignedURLBuilder.getPreSignedURL( key: self.key, signingOperation: operation, + metadata: nil, accelerate: nil, expires: nil ) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift index 0664ef453b..df6b3cb856 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift @@ -22,9 +22,15 @@ extension MockAWSS3PreSignedURLBuilder: AWSS3PreSignedURLBuilderBehavior { func getPreSignedURL( key: String, signingOperation: AWSS3SigningOperation, + metadata: [String : String]?, accelerate: Bool?, expires: Int64?) async throws -> URL { - interactions.append("\(#function) \(key) \(signingOperation) \(String(describing: expires))") + if let metadata = metadata { + interactions.append("\(#function) \(key) \(signingOperation) \(metadata) \(String(describing: expires))") + } else { + interactions.append("\(#function) \(key) \(signingOperation) \(String(describing: expires))") + } + return try await getPreSignedURLHandler(key, signingOperation, expires) } } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift index d11d5bd499..2b70e3bc90 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift @@ -80,9 +80,10 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { public func getPreSignedURL( serviceKey: String, signingOperation: AWSS3SigningOperation, + metadata: [String: String]?, accelerate: Bool?, expires: Int) async throws -> URL { - interactions.append("\(#function) \(serviceKey) \(signingOperation) \(expires)") + interactions.append("\(#function) \(serviceKey) \(signingOperation) \(String(describing: metadata)) \(expires)") return try await getPreSignedURLHandler(serviceKey, signingOperation, expires) } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift index 787cd2ad3d..fa11c0e5c5 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift @@ -68,11 +68,12 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { func testForGetObject() async throws { let url = try await systemUnderTest.getPreSignedURL(serviceKey: serviceKey, signingOperation: .getObject, + metadata: nil, accelerate: nil, expires: expires) XCTAssertEqual(url, presignedURL) XCTAssertEqual(builder.interactions, [ - "getPreSignedURL(key:signingOperation:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.getObject) \(String(describing: expires))" + "getPreSignedURL(key:signingOperation:metadata:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.getObject) \(String(describing: expires))" ]) } @@ -82,11 +83,28 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { func testForPutObject() async throws { let url = try await systemUnderTest.getPreSignedURL(serviceKey: serviceKey, signingOperation: .putObject, + metadata: nil, accelerate: nil, expires: expires) XCTAssertEqual(url, presignedURL) XCTAssertEqual(builder.interactions, [ - "getPreSignedURL(key:signingOperation:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.putObject) \(String(describing: expires))" + "getPreSignedURL(key:signingOperation:metadata:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.putObject) \(String(describing: expires))" + ]) + } + + /// - Given: A storage service configured to use a AWSS3PreSignedURLBuilder + /// - When: A presigned URL is requested for a **AWSS3SigningOperation.putObject** operation with metadata + /// - Then: A valid URL is returned + func testForPutObjectWithMetadata() async throws { + let metadata = ["test": "value"] + let url = try await systemUnderTest.getPreSignedURL(serviceKey: serviceKey, + signingOperation: .putObject, + metadata: metadata, + accelerate: nil, + expires: expires) + XCTAssertEqual(url, presignedURL) + XCTAssertEqual(builder.interactions, [ + "getPreSignedURL(key:signingOperation:metadata:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.putObject) \(metadata) \(String(describing: expires))" ]) } @@ -97,11 +115,12 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { let operation = AWSS3SigningOperation.uploadPart(partNumber: 0, uploadId: UUID().uuidString) let url = try await systemUnderTest.getPreSignedURL(serviceKey: serviceKey, signingOperation: operation, + metadata: nil, accelerate: nil, expires: expires) XCTAssertEqual(url, presignedURL) XCTAssertEqual(builder.interactions, [ - "getPreSignedURL(key:signingOperation:accelerate:expires:) \(serviceKey ?? "") \(operation) \(String(describing: expires))" + "getPreSignedURL(key:signingOperation:metadata:accelerate:expires:) \(serviceKey ?? "") \(operation) \(String(describing: expires))" ]) }