Saturday, September 21, 2019

RestKit RequestDescriptor Mappings

-(RKRequestDescriptor *)getMetricsRequestDescriptor
{
    RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
    [requestMapping addAttributeMappingsFromArray:@[@"Id", @"Type",@"tok", @"CmID"]];

    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[class_metrics_param class] rootKeyPath:nil method:RKRequestMethodPOST];

    return requestDescriptor;

}

RestKit ResonseDescriptor Mappings

-(RKResponseDescriptor *)getCompressorsResponseDescriptor
{
    
    RKObjectMapping *compressors_mapping = [RKObjectMapping mappingForClass:[class_compressors class]];
    [compressors_mapping addAttributeMappingsFromDictionary:@{
                                                                  @"ResponseCode":@"ResponseCode",
                                                                  @"ResponseType":@"ResponseType",
                                                                  @"ResponseMessage":@"ResponseMessage"
                                                                  }];
    
    RKObjectMapping *compressor_mapping = [RKObjectMapping mappingForClass:[class_compressor class]];
    [compressor_mapping addAttributeMappingsFromDictionary:@{
                                                             @"CmID":@"CmID"
                                                             }];
    
    
    RKObjectMapping *fault_alert_mapping = [RKObjectMapping mappingForClass:[class_fault_alerts class]];
    [fault_alert_mapping addAttributeMappingsFromDictionary:@{
                                                              @"Message":@"Message"
                                                              }];
    
    RKObjectMapping *service_due_alert_mapping = [RKObjectMapping mappingForClass:[class_service_due_alerts class]];
    [service_due_alert_mapping addAttributeMappingsFromDictionary:@{
                                                                    @"Type":@"Type"
                                                                    }];
    
    
    [compressor_mapping addPropertyMapping:[RKRelationshipMapping
                                            relationshipMappingFromKeyPath:@"FAlerts"
                                            toKeyPath:@"FAlerts"
                                            withMapping:fault_alert_mapping]];
    
    [compressor_mapping addPropertyMapping:[RKRelationshipMapping
                                            relationshipMappingFromKeyPath:@"SDueAlerts"
                                            toKeyPath:@"SAlerts"
                                            withMapping:service_due_alert_mapping]];
    
    [compressors_mapping addPropertyMapping:[RKRelationshipMapping
                                                 relationshipMappingFromKeyPath:@"Cms"
                                                 toKeyPath:@"Cms"
                                                 withMapping:compressor_mapping]];
    
    NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:compressors_mapping
                                                                                            method:RKRequestMethodGET
                                                                                       pathPattern:nil
                                                                                           keyPath:nil
                                                                                       statusCodes:statusCodes];
    
    return responseDescriptor;

}

Services For RestKit GET and POST

-(NSURLRequest *)createRequestWithURL:(NSString *)url
                               params:(NSDictionary *)params
                           HTTPMethod:(NSString *)HTTPMethod
{
    NSURL *URL = [[NSURL alloc] initWithString:kBaseURL];
    AFRKHTTPClient *client = [[AFRKHTTPClient alloc] initWithBaseURL:URL];
    
    NSMutableURLRequest *request = [client requestWithMethod:HTTPMethod path:url parameters:params];
    return request;
}

-(void)getObjectFromURL:(NSString *)url
             HTTPMethod:(NSString *)method
                 params:(NSDictionary *)params
             descriptor:(RKResponseDescriptor *)responseDescriptor
             onComplete:(void (^)(id _Nonnull))onCompleteHandler
                onError:(void (^)(NSError * _Nonnull))onErrorHandler
{
    NSURLRequest *request = [self createRequestWithURL:url params:params HTTPMethod:method];
    RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc]
                                           initWithRequest:request
                                           responseDescriptors:@[responseDescriptor]];
    
    [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation,
                                                RKMappingResult *mappingResult) {
        if(onCompleteHandler)
        {
            onCompleteHandler((mappingResult.set.count > 1) ? mappingResult.set : mappingResult.firstObject);
        }
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        if(onErrorHandler)
        {
            onErrorHandler(error);
        }
    }];
    
    NSOperationQueue *queue = [NSOperationQueue new];
    [queue addOperation:operation];
}

-(void)postObjectFromURL:(NSString *)baseURL
                    path:(NSString *)path
             classObject:(id)classObject
       requestDescriptor:(RKRequestDescriptor *)requestDescriptor
      responseDescriptor:(RKResponseDescriptor *)responseDescriptor
              onComplete:(void (^)(id _Nonnull))onCompleteHandler
                 onError:(void (^)(NSError * _Nonnull))onErrorHandler
{
    if(baseURL == nil || [baseURL isEqualToString:@""])
        baseURL = kBaseURL;
    
    RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:baseURL]];
    [manager addRequestDescriptor:requestDescriptor];
    [manager addResponseDescriptor:responseDescriptor];
    
    [manager postObject:(classObject)
                   path:path parameters:nil
                success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        if(onCompleteHandler)
            onCompleteHandler((mappingResult.set.count > 1) ? mappingResult.set : mappingResult.firstObject);
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        if(onErrorHandler)
            onErrorHandler(error);
    }];

}