From bf3f5001a0677533c969dabf140fdbbfcf2a7699 Mon Sep 17 00:00:00 2001 From: Felipe Waku Date: Fri, 19 Oct 2018 20:55:01 -0300 Subject: [PATCH] Returning null as downloadUrl in upload task (#1620) solves: #1591 using the first solution: > 1. Still consider the invocation a success, providing downloadURL as null. Can some maintainer help me with the new test case? I need a file with permission to upload but not to download. --- .../firebase/storage/RNFirebaseStorage.java | 54 ++++++++++++------- tests/e2e/storage/storage.e2e.js | 16 ++++++ 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/android/src/main/java/io/invertase/firebase/storage/RNFirebaseStorage.java b/android/src/main/java/io/invertase/firebase/storage/RNFirebaseStorage.java index 45128a82..792596e0 100644 --- a/android/src/main/java/io/invertase/firebase/storage/RNFirebaseStorage.java +++ b/android/src/main/java/io/invertase/firebase/storage/RNFirebaseStorage.java @@ -564,29 +564,20 @@ public class RNFirebaseStorage extends ReactContextBaseJavaModule { taskSnapshot .getStorage() .getDownloadUrl() + .addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@Nonnull Exception e) { + int errorCode = ((StorageException) e).getErrorCode(); + if (errorCode == StorageException.ERROR_NOT_AUTHORIZED) { + WritableMap resp = getRespAsMap(taskSnapshot, null); + listener.onSuccess(resp); + } + } + }) .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Uri downloadUrl) { - WritableMap resp = Arguments.createMap(); - - resp.putDouble("bytesTransferred", taskSnapshot.getBytesTransferred()); - resp.putString("downloadURL", downloadUrl.toString()); - - StorageMetadata d = taskSnapshot.getMetadata(); - if (d != null) { - WritableMap metadata = getMetadataAsMap(d); - resp.putMap("metadata", metadata); - } - - resp.putString( - "ref", - taskSnapshot - .getStorage() - .getPath() - ); - resp.putString("state", RNFirebaseStorage.this.getTaskStatus(taskSnapshot.getTask())); - resp.putDouble("totalBytes", taskSnapshot.getTotalByteCount()); - + WritableMap resp = getRespAsMap(taskSnapshot, downloadUrl.toString()); listener.onSuccess(resp); } }); @@ -595,6 +586,29 @@ public class RNFirebaseStorage extends ReactContextBaseJavaModule { } } + + private WritableMap getRespAsMap(final UploadTask.TaskSnapshot taskSnapshot, final String downloadUrl) { + WritableMap resp = Arguments.createMap(); + + resp.putDouble("bytesTransferred", taskSnapshot.getBytesTransferred()); + resp.putString("downloadURL", downloadUrl); + + StorageMetadata d = taskSnapshot.getMetadata(); + if (d != null) { + WritableMap metadata = getMetadataAsMap(d); + resp.putMap("metadata", metadata); + } + + resp.putString( + "ref", + taskSnapshot + .getStorage() + .getPath() + ); + resp.putString("state", RNFirebaseStorage.this.getTaskStatus(taskSnapshot.getTask())); + resp.putDouble("totalBytes", taskSnapshot.getTotalByteCount()); + return resp; + } /** * Converts storageMetadata into a map * diff --git a/tests/e2e/storage/storage.e2e.js b/tests/e2e/storage/storage.e2e.js index 50f28f5b..027e8bd0 100644 --- a/tests/e2e/storage/storage.e2e.js +++ b/tests/e2e/storage/storage.e2e.js @@ -108,6 +108,22 @@ describe('storage()', () => { uploadTaskSnapshot.metadata.should.be.an.Object(); uploadTaskSnapshot.downloadURL.should.be.a.String(); }); + + it('uploads a file without read permission', async () => { + const uploadTaskSnapshot = await firebase + .storage() + .ref('/writeOnly.jpeg') + .putFile( + `${firebase.storage.Native.DOCUMENT_DIRECTORY_PATH}/ok.jpeg` + ); + + uploadTaskSnapshot.state.should.eql(firebase.storage.TaskState.SUCCESS); + uploadTaskSnapshot.bytesTransferred.should.eql( + uploadTaskSnapshot.totalBytes + ); + uploadTaskSnapshot.metadata.should.be.an.Object(); + should.not.exist(uploadTaskSnapshot.downloadURL); + }); }); describe('on()', () => {