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()', () => {