diff options
author | Sebastian Schmidt <mrschmidt@google.com> | 2017-09-06 14:37:04 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-06 14:37:04 -0700 |
commit | e8e0916c2ae24ec14130b1dc00f9574d78940462 (patch) | |
tree | 92554ccf9e084f62546b85ad035e71c005a3d67a /Firebase | |
parent | 96685dfbb9936ec9b875491ccad9891231afd7ba (diff) |
Firebase Storage: Allowing metadata to be cleared (#197)
* Allowing metadata to be cleared
Diffstat (limited to 'Firebase')
-rw-r--r-- | Firebase/Storage/FIRStorageMetadata.m | 37 | ||||
-rw-r--r-- | Firebase/Storage/FIRStorageUpdateMetadataTask.m | 2 | ||||
-rw-r--r-- | Firebase/Storage/Private/FIRStorageMetadata_Private.h | 20 |
3 files changed, 57 insertions, 2 deletions
diff --git a/Firebase/Storage/FIRStorageMetadata.m b/Firebase/Storage/FIRStorageMetadata.m index 4269a45..c4ff5a8 100644 --- a/Firebase/Storage/FIRStorageMetadata.m +++ b/Firebase/Storage/FIRStorageMetadata.m @@ -31,6 +31,8 @@ - (instancetype)initWithDictionary:(NSDictionary *)dictionary { self = [super init]; if (self) { + _initialMetadata = [dictionary copy]; + _bucket = dictionary[kFIRStorageMetadataBucket]; _cacheControl = dictionary[kFIRStorageMetadataCacheControl]; _contentDisposition = dictionary[kFIRStorageMetadataContentDisposition]; @@ -73,7 +75,10 @@ #pragma mark - NSObject overrides - (instancetype)copyWithZone:(NSZone *)zone { - return [[[self class] allocWithZone:zone] initWithDictionary:[self dictionaryRepresentation]]; + FIRStorageMetadata *clone = + [[[self class] allocWithZone:zone] initWithDictionary:[self dictionaryRepresentation]]; + clone.initialMetadata = [self.initialMetadata copy]; + return clone; } - (BOOL)isEqual:(id)object { @@ -200,6 +205,36 @@ return [_downloadURLs firstObject]; } +#pragma mark - Private methods + ++ (void)removeMatchingMetadata:(NSMutableDictionary *)metadata + oldMetadata:(NSDictionary *)oldMetadata { + for (NSString* metadataKey in [oldMetadata allKeys]) { + id oldValue = [oldMetadata objectForKey:metadataKey]; + id newValue = [metadata objectForKey:metadataKey]; + + if (oldValue && !newValue) { + [metadata setObject:[NSNull null] forKey:metadataKey]; + } else if ([oldValue isKindOfClass:[NSString class]] && + [newValue isKindOfClass:[NSString class]]) { + if ([oldValue isEqualToString:newValue]) { + [metadata removeObjectForKey:metadataKey]; + } + } else if ([oldValue isKindOfClass:[NSDictionary class]] && + [newValue isKindOfClass:[NSDictionary class]]) { + NSMutableDictionary *nestedMetadata = [newValue mutableCopy]; + [self removeMatchingMetadata:nestedMetadata oldMetadata:oldValue]; + [metadata setObject:[nestedMetadata copy] forKey:metadataKey]; + } + } +} + +- (NSDictionary *)updatedMetadata { + NSMutableDictionary *metadataUpdate = [[self dictionaryRepresentation] mutableCopy]; + [FIRStorageMetadata removeMatchingMetadata:metadataUpdate oldMetadata:_initialMetadata]; + return [metadataUpdate copy]; +} + #pragma mark - RFC 3339 conversions static NSDateFormatter *sRFC3339DateFormatter; diff --git a/Firebase/Storage/FIRStorageUpdateMetadataTask.m b/Firebase/Storage/FIRStorageUpdateMetadataTask.m index 005f78f..642ebcd 100644 --- a/Firebase/Storage/FIRStorageUpdateMetadataTask.m +++ b/Firebase/Storage/FIRStorageUpdateMetadataTask.m @@ -45,7 +45,7 @@ - (void)enqueue { NSMutableURLRequest *request = [self.baseRequest mutableCopy]; - NSDictionary *updateDictionary = [_updateMetadata dictionaryRepresentation]; + NSDictionary *updateDictionary = [_updateMetadata updatedMetadata]; NSData *updateData = [NSData frs_dataFromJSONDictionary:updateDictionary]; request.HTTPMethod = @"PATCH"; request.timeoutInterval = self.reference.storage.maxUploadRetryTime; diff --git a/Firebase/Storage/Private/FIRStorageMetadata_Private.h b/Firebase/Storage/Private/FIRStorageMetadata_Private.h index 629c935..ad8cc94 100644 --- a/Firebase/Storage/Private/FIRStorageMetadata_Private.h +++ b/Firebase/Storage/Private/FIRStorageMetadata_Private.h @@ -15,6 +15,7 @@ */ #import "FIRStorageConstants_Private.h" +#import "FIRStorageMetadata.h" @class FIRStorageReference; @@ -34,6 +35,25 @@ NS_ASSUME_NONNULL_BEGIN @property(readwrite) FIRStorageMetadataType type; /** + * The original metadata representation received from the server or an empty dictionary + * if the metadata object was initialized by the user. + */ +@property(copy, nonatomic) NSDictionary *initialMetadata; + +/** + * Recursively removes entries in 'metadata' that are unmodified from 'oldMetadata'. + * Adds 'NSNull' for entries that only exist in oldMetadata. + */ ++ (void)removeMatchingMetadata:(NSMutableDictionary *)metadata + oldMetadata:(NSDictionary *)oldMetadata; + +/** + * Computes the updates between the state at initialization and the current state. + * Returns a dictionary with only the updated data. Removed keys are set to NSNull. + */ +- (NSDictionary *)updatedMetadata; + +/** * Returns an RFC3339 formatted date from a string. * @param dateString An NSString of the form: yyyy-MM-ddTHH:mm:ss.SSSZ. * @return An NSDate populated from the string or nil if conversion isn't possible. |