An amazing project that generates micro reports from tournament results
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

232 lines
7.9 KiB

////////////////////////////////////////////////////////////////////////////
//
// Copyright 2017 Realm Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////
#import "RLMJSONModels.h"
#import "RLMSyncUtil_Private.h"
#import "RLMSyncUser.h"
#pragma mark - Constants
static const NSString *const kRLMSyncAccessTokenKey = @"access_token";
static const NSString *const kRLMSyncAccountsKey = @"accounts";
static const NSString *const kRLMSyncErrorCodeKey = @"code";
static const NSString *const kRLMSyncExpiresKey = @"expires";
static const NSString *const kRLMSyncErrorHintKey = @"hint";
static const NSString *const kRLMSyncIdKey = @"id";
static const NSString *const kRLMSyncKeyKey = @"key";
static const NSString *const kRLMSyncMetadataKey = @"metadata";
static const NSString *const kRLMSyncRefreshTokenKey = @"refresh_token";
static const NSString *const kRLMSyncErrorStatusKey = @"status";
static const NSString *const kRLMSyncErrorTitleKey = @"title";
static const NSString *const kRLMSyncTokenDataKey = @"token_data";
static const NSString *const kRLMSyncUserKey = @"user";
static const NSString *const kRLMSyncValueKey = @"value";
#pragma mark - RLMTokenDataModel
@interface RLMTokenDataModel ()
@property (nonatomic, readwrite) NSString *identity;
@property (nonatomic, readwrite) NSString *appID;
@property (nonatomic, readwrite) NSString *path;
@property (nonatomic, readwrite) NSTimeInterval expires;
@property (nonatomic, readwrite) BOOL isAdmin;
//@property (nonatomic, readwrite) NSArray *access;
@end
@implementation RLMTokenDataModel
- (instancetype)initWithDictionary:(NSDictionary *)jsonDictionary {
if (self = [super init]) {
self.isAdmin = NO;
RLM_SYNC_PARSE_STRING_OR_ABORT(jsonDictionary, kRLMSyncIdentityKey, identity);
RLM_SYNC_PARSE_OPTIONAL_STRING(jsonDictionary, kRLMSyncAppIDKey, appID);
RLM_SYNC_PARSE_OPTIONAL_STRING(jsonDictionary, kRLMSyncPathKey, path);
RLM_SYNC_PARSE_OPTIONAL_BOOL(jsonDictionary, kRLMSyncIsAdminKey, isAdmin);
RLM_SYNC_PARSE_DOUBLE_OR_ABORT(jsonDictionary, kRLMSyncExpiresKey, expires);
return self;
}
return nil;
}
@end
#pragma mark - RLMTokenModel
@interface RLMTokenModel ()
@property (nonatomic, readwrite) NSString *token;
@property (nonatomic, nullable, readwrite) NSString *path;
@property (nonatomic, readwrite) RLMTokenDataModel *tokenData;
@end
@implementation RLMTokenModel
- (instancetype)initWithDictionary:(NSDictionary *)jsonDictionary {
if (self = [super init]) {
RLM_SYNC_PARSE_STRING_OR_ABORT(jsonDictionary, kRLMSyncTokenKey, token);
RLM_SYNC_PARSE_OPTIONAL_STRING(jsonDictionary, kRLMSyncPathKey, path);
RLM_SYNC_PARSE_MODEL_OR_ABORT(jsonDictionary, kRLMSyncTokenDataKey, RLMTokenDataModel, tokenData);
return self;
}
return nil;
}
@end
#pragma mark - RLMAuthResponseModel
@interface RLMAuthResponseModel ()
@property (nonatomic, readwrite) RLMTokenModel *accessToken;
@property (nonatomic, readwrite) RLMTokenModel *refreshToken;
@end
@implementation RLMAuthResponseModel
- (instancetype)initWithDictionary:(NSDictionary *)jsonDictionary
requireAccessToken:(BOOL)requireAccessToken
requireRefreshToken:(BOOL)requireRefreshToken {
if (self = [super init]) {
// Get the access token.
if (requireAccessToken) {
RLM_SYNC_PARSE_MODEL_OR_ABORT(jsonDictionary, kRLMSyncAccessTokenKey, RLMTokenModel, accessToken);
} else {
RLM_SYNC_PARSE_OPTIONAL_MODEL(jsonDictionary, kRLMSyncAccessTokenKey, RLMTokenModel, accessToken);
}
// Get the refresh token.
if (requireRefreshToken) {
RLM_SYNC_PARSE_MODEL_OR_ABORT(jsonDictionary, kRLMSyncRefreshTokenKey, RLMTokenModel, refreshToken);
} else {
RLM_SYNC_PARSE_OPTIONAL_MODEL(jsonDictionary, kRLMSyncRefreshTokenKey, RLMTokenModel, refreshToken);
}
return self;
}
return nil;
}
@end
#pragma mark - RLMUserInfoResponseModel
@interface RLMSyncUserAccountInfo ()
@property (nonatomic, readwrite) NSString *provider;
@property (nonatomic, readwrite) NSString *providerUserIdentity;
@end
@implementation RLMSyncUserAccountInfo
- (instancetype)initWithDictionary:(NSDictionary *)jsonDictionary {
if (self = [super init]) {
RLM_SYNC_PARSE_STRING_OR_ABORT(jsonDictionary, kRLMSyncProviderKey, provider);
RLM_SYNC_PARSE_STRING_OR_ABORT(jsonDictionary, kRLMSyncProviderIDKey, providerUserIdentity);
return self;
}
return nil;
}
@end
@interface RLMUserResponseModel ()
@property (nonatomic, readwrite) NSString *identity;
@property (nonatomic, readwrite) NSArray *accounts;
@property (nonatomic, readwrite) NSDictionary *metadata;
@property (nonatomic, readwrite) BOOL isAdmin;
@end
@implementation RLMUserResponseModel
- (void)parseMetadataFromJSON:(NSDictionary *)jsonDictionary {
NSMutableDictionary *buffer = [NSMutableDictionary dictionary];
NSArray *metadataArray = jsonDictionary[kRLMSyncMetadataKey];
if (![metadataArray isKindOfClass:[NSArray class]]) {
self.metadata = @{};
return;
}
for (NSDictionary *object in metadataArray) {
if (![object isKindOfClass:[NSDictionary class]]) {
continue;
}
NSString *key = object[kRLMSyncKeyKey];
NSString *value = object[kRLMSyncValueKey];
if (!key || !value) {
continue;
}
buffer[key] = value;
}
self.metadata = [buffer copy];
}
- (instancetype)initWithDictionary:(NSDictionary *)jsonDictionary {
if (self = [super init]) {
self.isAdmin = NO;
RLM_SYNC_PARSE_STRING_OR_ABORT(jsonDictionary, kRLMSyncUserIDKey, identity);
RLM_SYNC_PARSE_OPTIONAL_BOOL(jsonDictionary, kRLMSyncIsAdminKey, isAdmin);
RLM_SYNC_PARSE_MODEL_ARRAY_OR_ABORT(jsonDictionary, kRLMSyncAccountsKey, RLMSyncUserAccountInfo, accounts);
[self parseMetadataFromJSON:jsonDictionary];
return self;
}
return nil;
}
@end
#pragma mark - RLMSyncErrorResponseModel
@interface RLMSyncErrorResponseModel ()
@property (nonatomic, readwrite) NSInteger status;
@property (nonatomic, readwrite) NSInteger code;
@property (nonatomic, readwrite) NSString *title;
@property (nonatomic, readwrite) NSString *hint;
@end
@implementation RLMSyncErrorResponseModel
- (instancetype)initWithDictionary:(NSDictionary *)jsonDictionary {
if (self = [super init]) {
RLM_SYNC_PARSE_DOUBLE_OR_ABORT(jsonDictionary, kRLMSyncErrorStatusKey, status);
RLM_SYNC_PARSE_DOUBLE_OR_ABORT(jsonDictionary, kRLMSyncErrorCodeKey, code);
RLM_SYNC_PARSE_OPTIONAL_STRING(jsonDictionary, kRLMSyncErrorTitleKey, title);
RLM_SYNC_PARSE_OPTIONAL_STRING(jsonDictionary, kRLMSyncErrorHintKey, hint);
NSString *detail = jsonDictionary[@"detail"];
if ([detail isKindOfClass:[NSString class]]) {
_title = detail;
}
for (NSDictionary<NSString *, NSString *> *problem in jsonDictionary[@"invalid_params"]) {
NSString *name = problem[@"name"];
NSString *reason = problem[@"reason"];
if (name && reason) {
_title = [NSString stringWithFormat:@"%@ %@: %@;", _title, name, reason];
}
}
return self;
}
return nil;
}
@end