Skip to content

Commit

Permalink
feat(storage): multi bucket download file api (#5656)
Browse files Browse the repository at this point in the history
* Updated dowload file options to accept bucket parameter
added integration tests

* updated todo message

* updates variable names and tests

* Update packages/storage/amplify_storage_s3_dart/lib/src/amplify_storage_s3_dart_impl.dart

---------

Co-authored-by: NikaHsn <[email protected]>
  • Loading branch information
2 people authored and Nika Hassani committed Nov 20, 2024
1 parent 77a2fd7 commit 1d9c618
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

import 'package:aws_common/aws_common.dart';
import 'package:amplify_core/amplify_core.dart';

/// {@template amplify_core.storage.download_file_options}
/// Configurable options for `Amplify.Storage.downloadFile`.
Expand All @@ -14,20 +14,25 @@ class StorageDownloadFileOptions
/// {@macro amplify_core.storage.download_file_options}
const StorageDownloadFileOptions({
this.pluginOptions,
this.bucket,
});

/// {@macro amplify_core.storage.download_file_plugin_options}
final StorageDownloadFilePluginOptions? pluginOptions;

/// Optionally specify which bucket to target
final StorageBucket? bucket;

@override
List<Object?> get props => [pluginOptions];
List<Object?> get props => [pluginOptions, bucket];

@override
String get runtimeTypeName => 'StorageDownloadFileOptions';

@override
Map<String, Object?> toJson() => {
'pluginOptions': pluginOptions?.toJson(),
'bucket': bucket,
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ void main() {
final name = 'download-file-with-identity-id-${uuid()}';
final metadataFilePath = 'public/download-file-get-properties-${uuid()}';
final metadata = {'description': 'foo'};

final secondaryBucket =
StorageBucket.fromOutputs('Storage Integ Test secondary bucket');
setUpAll(() async {
directory = kIsWeb ? '/' : (await getTemporaryDirectory()).path;
});
Expand All @@ -51,6 +52,22 @@ void main() {
),
).result;

// secondary bucket uploads

await Amplify.Storage.uploadData(
data: StorageDataPayload.bytes(data),
path: StoragePath.fromString(publicPath),
options: StorageUploadDataOptions(bucket: secondaryBucket),
).result;

await Amplify.Storage.uploadData(
data: StorageDataPayload.bytes(data),
path: StoragePath.fromIdentityId(
(identityId) => 'private/$identityId/$name',
),
options: StorageUploadDataOptions(bucket: secondaryBucket),
).result;

await Amplify.Storage.uploadData(
data: StorageDataPayload.bytes(data),
path: StoragePath.fromString(metadataFilePath),
Expand All @@ -68,6 +85,48 @@ void main() {
);
});

group('multibucket', () {
testWidgets('to file', (_) async {
final downloadFilePath = '$directory/downloaded-file.txt';

final result = await Amplify.Storage.downloadFile(
path: StoragePath.fromString(publicPath),
localFile: AWSFile.fromPath(downloadFilePath),
options: StorageDownloadFileOptions(
bucket: secondaryBucket,
),
).result;

// Web browsers do not grant access to read arbitrary files
if (!kIsWeb) {
final downloadedFile = await readFile(path: downloadFilePath);
expect(downloadedFile, data);
}

expect(result.localFile.path, downloadFilePath);
expect(result.downloadedItem.path, publicPath);
});
testWidgets('from identity ID', (_) async {
final downloadFilePath = '$directory/downloaded-file.txt';
final result = await Amplify.Storage.downloadFile(
path: StoragePath.fromIdentityId(
(identityId) => 'private/$identityId/$name',
),
localFile: AWSFile.fromPath(downloadFilePath),
options: StorageDownloadFileOptions(
bucket: secondaryBucket,
),
).result;

if (!kIsWeb) {
final downloadedFile = await readFile(path: downloadFilePath);
expect(downloadedFile, data);
}
expect(result.localFile.path, downloadFilePath);
expect(result.downloadedItem.path, identityPath);
});
});

group('for file type', () {
testWidgets('to file', (_) async {
final downloadFilePath = '$directory/downloaded-file.txt';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ class AmplifyStorageS3Dart extends StoragePluginInterface
);
options = StorageDownloadFileOptions(
pluginOptions: s3PluginOptions,
bucket: options?.bucket,
);
return download_file_impl.downloadFile(
path: path,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ Future<S3DownloadFileResult> _downloadFromUrl({
// operation.
final downloadedItem = (await storageS3Service.getProperties(
path: path,
options: const StorageGetPropertiesOptions(),
options: StorageGetPropertiesOptions(bucket: options.bucket),
))
.storageItem;

Expand All @@ -71,6 +71,7 @@ Future<S3DownloadFileResult> _downloadFromUrl({
pluginOptions: S3GetUrlPluginOptions(
useAccelerateEndpoint: s3PluginOptions.useAccelerateEndpoint,
),
bucket: options.bucket,
),
))
.url;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ S3DownloadFileOperation downloadFile({
getProperties: s3PluginOptions.getProperties,
useAccelerateEndpoint: s3PluginOptions.useAccelerateEndpoint,
),
bucket: options.bucket,
);

final downloadDataTask = storageS3Service.downloadData(
Expand Down

0 comments on commit 1d9c618

Please sign in to comment.