Skip to content

Commit

Permalink
fix(storage, ios): correct storage metadata update / delete
Browse files Browse the repository at this point in the history
  • Loading branch information
mikehardy committed Jun 19, 2022
1 parent 6cd53ea commit 2dcb079
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 19 deletions.
3 changes: 2 additions & 1 deletion packages/storage/ios/RNFBStorage/RNFBStorageCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@

+ (NSString *)getTaskStatus:(FIRStorageTaskStatus)status;

+ (FIRStorageMetadata *)buildMetadataFromMap:(NSDictionary *)metadata;
+ (FIRStorageMetadata *)buildMetadataFromMap:(NSDictionary *)metadata
existingMetadata:(FIRStorageMetadata *)existingMetadata;

+ (NSArray *)getErrorCodeMessage:(NSError *)error;

Expand Down
65 changes: 61 additions & 4 deletions packages/storage/ios/RNFBStorage/RNFBStorageCommon.m
Original file line number Diff line number Diff line change
Expand Up @@ -392,9 +392,64 @@ + (NSString *)getTaskStatus:(FIRStorageTaskStatus)status {
}
}

+ (FIRStorageMetadata *)buildMetadataFromMap:(NSDictionary *)metadata {
FIRStorageMetadata *storageMetadata = [[FIRStorageMetadata alloc] initWithDictionary:metadata];
storageMetadata.customMetadata = [metadata[@"customMetadata"] mutableCopy];
+ (FIRStorageMetadata *)buildMetadataFromMap:(NSDictionary *)metadata
existingMetadata:(nullable FIRStorageMetadata *)existingMetadata {
// If an existing metadata was passed in, modify it with our map, otherwise init a fresh copy
FIRStorageMetadata *storageMetadata = existingMetadata;
if (storageMetadata == nil) {
storageMetadata = [[FIRStorageMetadata alloc] init];
}

if (metadata[@"cacheControl"] == [NSNull null]) {
storageMetadata.cacheControl = nil;
} else {
storageMetadata.cacheControl = metadata[@"cacheControl"];
}

if (metadata[@"contentLanguage"] == [NSNull null]) {
storageMetadata.contentLanguage = nil;
} else {
storageMetadata.contentLanguage = metadata[@"contentLanguage"];
}

if (metadata[@"contentEncoding"] == [NSNull null]) {
storageMetadata.contentEncoding = nil;
} else {
storageMetadata.contentEncoding = metadata[@"contentEncoding"];
}

if (metadata[@"contentDisposition"] == [NSNull null]) {
storageMetadata.contentDisposition = nil;
} else {
storageMetadata.contentDisposition = metadata[@"contentDisposition"];
}

if (metadata[@"contentType"] == [NSNull null]) {
storageMetadata.contentType = nil;
} else {
storageMetadata.contentType = metadata[@"contentType"];
}

if (metadata[@"customMetadata"] == [NSNull null]) {
storageMetadata.customMetadata = @{};
} else {
NSMutableDictionary *customMetadata = [metadata[@"customMetadata"] mutableCopy];
for (NSString *key in customMetadata.allKeys) {
if (customMetadata[key] == [NSNull null] || customMetadata[key] == nil) {
[customMetadata removeObjectForKey:key];
}
}
storageMetadata.customMetadata = customMetadata;
}

// md5hash may be settable but is not update-able, so just test for existence and carry it in
// FIXME this will need a fix related to
// https://github.com/firebase/firebase-ios-sdk/issues/9849#issuecomment-1159292592 if
// (metadata[@"md5hash"]) {
// NSLog(@"STORAGE md5hash was set");
// storageMetadata.md5Hash = metadata[@"md5hash"];
// }

return storageMetadata;
}

Expand All @@ -418,7 +473,9 @@ + (NSArray *)getErrorCodeMessage:(NSError *)error {
message = @"The specified device file path is invalid or is restricted.";
} else {
if (userInfo[@"ResponseBody"]) {
message = [NSString stringWithFormat:@"An unknown error has occurred. (underlying reason '%@')", userInfo[@"ResponseBody"]];
message =
[NSString stringWithFormat:@"An unknown error has occurred. (underlying reason '%@')",
userInfo[@"ResponseBody"]];
} else {
message = @"An unknown error has occurred.";
}
Expand Down
35 changes: 23 additions & 12 deletions packages/storage/ios/RNFBStorage/RNFBStorageModule.m
Original file line number Diff line number Diff line change
Expand Up @@ -143,17 +143,26 @@ - (void)invalidate {
: (RCTPromiseResolveBlock)resolve
: (RCTPromiseRejectBlock)reject) {
FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
FIRStorageMetadata *storageMetadata = [RNFBStorageCommon buildMetadataFromMap:metadata];

[storageReference
updateMetadata:storageMetadata
completion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) {
if (error != nil) {
[self promiseRejectStorageException:reject error:error];
} else {
resolve([RNFBStorageCommon metadataToDict:metadata]);
}
}];
[storageReference metadataWithCompletion:^(FIRStorageMetadata *_Nullable fetchedMetadata,
NSError *_Nullable error) {
if (error != nil) {
[self promiseRejectStorageException:reject error:error];
} else {
FIRStorageMetadata *storageMetadata =
[RNFBStorageCommon buildMetadataFromMap:metadata existingMetadata:fetchedMetadata];

[storageReference updateMetadata:storageMetadata
completion:^(FIRStorageMetadata *_Nullable updatedMetadata,
NSError *_Nullable error) {
if (error != nil) {
[self promiseRejectStorageException:reject error:error];
} else {
resolve([RNFBStorageCommon metadataToDict:updatedMetadata]);
}
}];
}
}];
}

/**
Expand Down Expand Up @@ -391,7 +400,8 @@ - (void)invalidate {
: (nonnull NSNumber *)taskId
: (RCTPromiseResolveBlock)resolve
: (RCTPromiseRejectBlock)reject) {
FIRStorageMetadata *storageMetadata = [RNFBStorageCommon buildMetadataFromMap:metadata];
FIRStorageMetadata *storageMetadata = [RNFBStorageCommon buildMetadataFromMap:metadata
existingMetadata:nil];
FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];

[RNFBStorageCommon
Expand Down Expand Up @@ -462,7 +472,8 @@ - (void)invalidate {
: (nonnull NSNumber *)taskId
: (RCTPromiseResolveBlock)resolve
: (RCTPromiseRejectBlock)reject) {
FIRStorageMetadata *storageMetadata = [RNFBStorageCommon buildMetadataFromMap:metadata];
FIRStorageMetadata *storageMetadata = [RNFBStorageCommon buildMetadataFromMap:metadata
existingMetadata:nil];
FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];

__block FIRStorageUploadTask *uploadTask;
Expand Down
4 changes: 2 additions & 2 deletions packages/storage/lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,9 @@ export function validateMetadata(metadata, update = true) {
`firebase.storage.SettableMetadata invalid property '${key}' should be a string or null value.`,
);
}
} else if (!isObject(value)) {
} else if (!isObject(value) && !isNull(value)) {
throw new Error(
'firebase.storage.SettableMetadata.customMetadata must be an object of keys and string values.',
'firebase.storage.SettableMetadata.customMetadata must be an object of keys and string values or null value.',
);
}
}
Expand Down

0 comments on commit 2dcb079

Please sign in to comment.