// Copyright © 2019 650 Industries. All rights reserved. #import #import #import #import #import NS_ASSUME_NONNULL_BEGIN @interface EXUpdatesUpdate () @property (nonatomic, strong, readwrite) NSDictionary *rawManifest; @end @implementation EXUpdatesUpdate - (instancetype)initWithRawManifest:(NSDictionary *)manifest config:(EXUpdatesConfig *)config database:(nullable EXUpdatesDatabase *)database { if (self = [super init]) { _rawManifest = manifest; _config = config; _database = database; _scopeKey = config.scopeKey; _isDevelopmentMode = NO; } return self; } + (instancetype)updateWithId:(NSUUID *)updateId scopeKey:(NSString *)scopeKey commitTime:(NSDate *)commitTime runtimeVersion:(NSString *)runtimeVersion metadata:(nullable NSDictionary *)metadata status:(EXUpdatesUpdateStatus)status keep:(BOOL)keep config:(EXUpdatesConfig *)config database:(EXUpdatesDatabase *)database { // for now, we store the entire managed manifest in the metadata field EXUpdatesUpdate *update = [[self alloc] initWithRawManifest:metadata ?: @{} config:config database:database]; update.updateId = updateId; update.scopeKey = scopeKey; update.commitTime = commitTime; update.runtimeVersion = runtimeVersion; update.metadata = metadata; update.status = status; update.keep = keep; return update; } + (instancetype)updateWithManifest:(NSDictionary *)manifest config:(EXUpdatesConfig *)config database:(EXUpdatesDatabase *)database { if (config.usesLegacyManifest) { return [EXUpdatesLegacyUpdate updateWithLegacyManifest:manifest config:config database:database]; } else { return [EXUpdatesNewUpdate updateWithNewManifest:manifest config:config database:database]; } } + (instancetype)updateWithEmbeddedManifest:(NSDictionary *)manifest config:(EXUpdatesConfig *)config database:(nullable EXUpdatesDatabase *)database { if (config.usesLegacyManifest) { if (manifest[@"releaseId"]) { return [EXUpdatesLegacyUpdate updateWithLegacyManifest:manifest config:config database:database]; } else { return [EXUpdatesBareUpdate updateWithBareManifest:manifest config:config database:database]; } } else { if (manifest[@"runtimeVersion"]) { return [EXUpdatesNewUpdate updateWithNewManifest:manifest config:config database:database]; } else { return [EXUpdatesBareUpdate updateWithBareManifest:manifest config:config database:database]; } } } - (NSArray *)assets { if (!_assets && _database) { dispatch_sync(_database.databaseQueue, ^{ NSError *error; self->_assets = [self->_database assetsWithUpdateId:self->_updateId error:&error]; NSAssert(self->_assets, @"Assets should be nonnull when selected from DB: %@", error.localizedDescription); }); } return _assets; } @end NS_ASSUME_NONNULL_END