You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-ios/SignalServiceKit/src/Network/API/OWSDevicesService.m

93 lines
3.1 KiB
Objective-C

//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "OWSDevicesService.h"
#import "OWSDevice.h"
#import "OWSError.h"
#import "OWSRequestFactory.h"
#import "TSNetworkManager.h"
#import <Mantle/MTLJSONAdapter.h>
NS_ASSUME_NONNULL_BEGIN
@implementation OWSDevicesService
- (void)getDevicesWithSuccess:(void (^)(NSArray<OWSDevice *> *))successCallback
failure:(void (^)(NSError *))failureCallback
{
TSRequest *request = [OWSRequestFactory getDevicesRequest];
[[TSNetworkManager sharedManager] makeRequest:request
success:^(NSURLSessionDataTask *task, id responseObject) {
DDLogVerbose(@"Get devices request succeeded");
NSArray<OWSDevice *> *devices = [self parseResponse:responseObject];
if (devices) {
successCallback(devices);
} else {
DDLogError(@"%@ unable to parse devices response:%@", self.logTag, responseObject);
NSError *error = OWSErrorMakeUnableToProcessServerResponseError();
failureCallback(error);
}
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
if (!IsNSErrorNetworkFailure(error)) {
OWSProdError([OWSAnalyticsEvents errorGetDevicesFailed]);
}
DDLogVerbose(@"Get devices request failed with error: %@", error);
failureCallback(error);
}];
}
- (void)unlinkDevice:(OWSDevice *)device
success:(void (^)(void))successCallback
failure:(void (^)(NSError *))failureCallback
{
TSRequest *request = [OWSRequestFactory deleteDeviceRequestWithDevice:device];
[[TSNetworkManager sharedManager] makeRequest:request
success:^(NSURLSessionDataTask *task, id responseObject) {
DDLogVerbose(@"Delete device request succeeded");
successCallback();
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
if (!IsNSErrorNetworkFailure(error)) {
OWSProdError([OWSAnalyticsEvents errorUnlinkDeviceFailed]);
}
DDLogVerbose(@"Get devices request failed with error: %@", error);
failureCallback(error);
}];
}
- (NSArray<OWSDevice *> *)parseResponse:(id)responseObject
{
if (![responseObject isKindOfClass:[NSDictionary class]]) {
DDLogError(@"Device response was not a dictionary.");
return nil;
}
NSDictionary *response = (NSDictionary *)responseObject;
NSArray<NSDictionary *> *devicesAttributes = response[@"devices"];
if (!devicesAttributes) {
DDLogError(@"Device response had no devices.");
return nil;
}
NSMutableArray<OWSDevice *> *devices = [NSMutableArray new];
for (NSDictionary *deviceAttributes in devicesAttributes) {
NSError *error;
OWSDevice *device = [OWSDevice deviceFromJSONDictionary:deviceAttributes error:&error];
if (error) {
DDLogError(@"Failed to build device from dictionary with error: %@", error);
} else {
[devices addObject:device];
}
}
return [devices copy];
}
@end
NS_ASSUME_NONNULL_END