Skip to content

Commit 2dcb079

Browse files
committed
fix(storage, ios): correct storage metadata update / delete
1 parent 6cd53ea commit 2dcb079

File tree

4 files changed

+88
-19
lines changed

4 files changed

+88
-19
lines changed

packages/storage/ios/RNFBStorage/RNFBStorageCommon.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@
5656

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

59-
+ (FIRStorageMetadata *)buildMetadataFromMap:(NSDictionary *)metadata;
59+
+ (FIRStorageMetadata *)buildMetadataFromMap:(NSDictionary *)metadata
60+
existingMetadata:(FIRStorageMetadata *)existingMetadata;
6061

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

packages/storage/ios/RNFBStorage/RNFBStorageCommon.m

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,64 @@ + (NSString *)getTaskStatus:(FIRStorageTaskStatus)status {
392392
}
393393
}
394394

395-
+ (FIRStorageMetadata *)buildMetadataFromMap:(NSDictionary *)metadata {
396-
FIRStorageMetadata *storageMetadata = [[FIRStorageMetadata alloc] initWithDictionary:metadata];
397-
storageMetadata.customMetadata = [metadata[@"customMetadata"] mutableCopy];
395+
+ (FIRStorageMetadata *)buildMetadataFromMap:(NSDictionary *)metadata
396+
existingMetadata:(nullable FIRStorageMetadata *)existingMetadata {
397+
// If an existing metadata was passed in, modify it with our map, otherwise init a fresh copy
398+
FIRStorageMetadata *storageMetadata = existingMetadata;
399+
if (storageMetadata == nil) {
400+
storageMetadata = [[FIRStorageMetadata alloc] init];
401+
}
402+
403+
if (metadata[@"cacheControl"] == [NSNull null]) {
404+
storageMetadata.cacheControl = nil;
405+
} else {
406+
storageMetadata.cacheControl = metadata[@"cacheControl"];
407+
}
408+
409+
if (metadata[@"contentLanguage"] == [NSNull null]) {
410+
storageMetadata.contentLanguage = nil;
411+
} else {
412+
storageMetadata.contentLanguage = metadata[@"contentLanguage"];
413+
}
414+
415+
if (metadata[@"contentEncoding"] == [NSNull null]) {
416+
storageMetadata.contentEncoding = nil;
417+
} else {
418+
storageMetadata.contentEncoding = metadata[@"contentEncoding"];
419+
}
420+
421+
if (metadata[@"contentDisposition"] == [NSNull null]) {
422+
storageMetadata.contentDisposition = nil;
423+
} else {
424+
storageMetadata.contentDisposition = metadata[@"contentDisposition"];
425+
}
426+
427+
if (metadata[@"contentType"] == [NSNull null]) {
428+
storageMetadata.contentType = nil;
429+
} else {
430+
storageMetadata.contentType = metadata[@"contentType"];
431+
}
432+
433+
if (metadata[@"customMetadata"] == [NSNull null]) {
434+
storageMetadata.customMetadata = @{};
435+
} else {
436+
NSMutableDictionary *customMetadata = [metadata[@"customMetadata"] mutableCopy];
437+
for (NSString *key in customMetadata.allKeys) {
438+
if (customMetadata[key] == [NSNull null] || customMetadata[key] == nil) {
439+
[customMetadata removeObjectForKey:key];
440+
}
441+
}
442+
storageMetadata.customMetadata = customMetadata;
443+
}
444+
445+
// md5hash may be settable but is not update-able, so just test for existence and carry it in
446+
// FIXME this will need a fix related to
447+
// https://github.com/firebase/firebase-ios-sdk/issues/9849#issuecomment-1159292592 if
448+
// (metadata[@"md5hash"]) {
449+
// NSLog(@"STORAGE md5hash was set");
450+
// storageMetadata.md5Hash = metadata[@"md5hash"];
451+
// }
452+
398453
return storageMetadata;
399454
}
400455

@@ -418,7 +473,9 @@ + (NSArray *)getErrorCodeMessage:(NSError *)error {
418473
message = @"The specified device file path is invalid or is restricted.";
419474
} else {
420475
if (userInfo[@"ResponseBody"]) {
421-
message = [NSString stringWithFormat:@"An unknown error has occurred. (underlying reason '%@')", userInfo[@"ResponseBody"]];
476+
message =
477+
[NSString stringWithFormat:@"An unknown error has occurred. (underlying reason '%@')",
478+
userInfo[@"ResponseBody"]];
422479
} else {
423480
message = @"An unknown error has occurred.";
424481
}

packages/storage/ios/RNFBStorage/RNFBStorageModule.m

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -143,17 +143,26 @@ - (void)invalidate {
143143
: (RCTPromiseResolveBlock)resolve
144144
: (RCTPromiseRejectBlock)reject) {
145145
FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
146-
FIRStorageMetadata *storageMetadata = [RNFBStorageCommon buildMetadataFromMap:metadata];
147146

148-
[storageReference
149-
updateMetadata:storageMetadata
150-
completion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) {
151-
if (error != nil) {
152-
[self promiseRejectStorageException:reject error:error];
153-
} else {
154-
resolve([RNFBStorageCommon metadataToDict:metadata]);
155-
}
156-
}];
147+
[storageReference metadataWithCompletion:^(FIRStorageMetadata *_Nullable fetchedMetadata,
148+
NSError *_Nullable error) {
149+
if (error != nil) {
150+
[self promiseRejectStorageException:reject error:error];
151+
} else {
152+
FIRStorageMetadata *storageMetadata =
153+
[RNFBStorageCommon buildMetadataFromMap:metadata existingMetadata:fetchedMetadata];
154+
155+
[storageReference updateMetadata:storageMetadata
156+
completion:^(FIRStorageMetadata *_Nullable updatedMetadata,
157+
NSError *_Nullable error) {
158+
if (error != nil) {
159+
[self promiseRejectStorageException:reject error:error];
160+
} else {
161+
resolve([RNFBStorageCommon metadataToDict:updatedMetadata]);
162+
}
163+
}];
164+
}
165+
}];
157166
}
158167

159168
/**
@@ -391,7 +400,8 @@ - (void)invalidate {
391400
: (nonnull NSNumber *)taskId
392401
: (RCTPromiseResolveBlock)resolve
393402
: (RCTPromiseRejectBlock)reject) {
394-
FIRStorageMetadata *storageMetadata = [RNFBStorageCommon buildMetadataFromMap:metadata];
403+
FIRStorageMetadata *storageMetadata = [RNFBStorageCommon buildMetadataFromMap:metadata
404+
existingMetadata:nil];
395405
FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
396406

397407
[RNFBStorageCommon
@@ -462,7 +472,8 @@ - (void)invalidate {
462472
: (nonnull NSNumber *)taskId
463473
: (RCTPromiseResolveBlock)resolve
464474
: (RCTPromiseRejectBlock)reject) {
465-
FIRStorageMetadata *storageMetadata = [RNFBStorageCommon buildMetadataFromMap:metadata];
475+
FIRStorageMetadata *storageMetadata = [RNFBStorageCommon buildMetadataFromMap:metadata
476+
existingMetadata:nil];
466477
FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
467478

468479
__block FIRStorageUploadTask *uploadTask;

packages/storage/lib/utils.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,9 @@ export function validateMetadata(metadata, update = true) {
8888
`firebase.storage.SettableMetadata invalid property '${key}' should be a string or null value.`,
8989
);
9090
}
91-
} else if (!isObject(value)) {
91+
} else if (!isObject(value) && !isNull(value)) {
9292
throw new Error(
93-
'firebase.storage.SettableMetadata.customMetadata must be an object of keys and string values.',
93+
'firebase.storage.SettableMetadata.customMetadata must be an object of keys and string values or null value.',
9494
);
9595
}
9696
}

0 commit comments

Comments
 (0)