sdks/other/ios/UGAPI/v2/UGConnection.m (798 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ // // UGConnection.m // UGAPIApp // // Created by Tim Burks on 3/30/13. // // #import "UGHTTPHelpers.h" #import "UGHTTPResult.h" #import "UGConnection.h" static NSString *boolean_representation(BOOL value) { return (value ? @"true" : @"false"); } @interface UGConnection () @property (nonatomic, strong) NSString *token; @property (nonatomic, strong) NSDate *tokenExpirationDate; @end @implementation UGConnection + (UGConnection *) sharedConnection { static UGConnection *connection = nil; if (!connection) { connection = [[UGConnection alloc] init]; } return connection; } - (id) init { if (self = [super init]) { self.server = @"http://api.usergrid.com"; } return self; } - (UGConnection *) copy { UGConnection *copy = [super copy]; copy.server = self.server; copy.organization = self.organization; copy.application = self.application; copy.token = self.token; copy.tokenExpirationDate = self.tokenExpirationDate; return copy; } #pragma mark - Internal helpers - - (NSString *) root { return [NSString stringWithFormat:@"%@/%@/%@", self.server, self.organization, self.application]; } - (NSMutableURLRequest *) authorizedRequestWithMethod:(NSString *) method path:(NSString *) path body:(NSData *) body { NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:path]]; [request setHTTPMethod:method]; if (body) { [request setHTTPBody:body]; } if (self.token) { [request setValue:[NSString stringWithFormat:@"Bearer %@", self.token] forHTTPHeaderField:@"Authorization"]; } return request; } #pragma mark - External helpers - #pragma mark Queries - (NSMutableDictionary *) queryWithString:(NSString *) queryString limit:(int) limit startUUID:(NSString *) startUUID cursor:(NSString *) cursor reversed:(BOOL) reversed { NSMutableDictionary *query = [NSMutableDictionary dictionary]; if (queryString) { query[@"ql"] = queryString; } if (limit > 0) { query[@"limit"] = [NSNumber numberWithInt:limit]; } if (startUUID) { query[@"start"] = startUUID; } if (cursor) { query[@"cursor"] = cursor; } if (reversed) { query[@"reversed"] = @"true"; } return query; } #pragma mark Authentication - (BOOL) authenticateWithResult:(UGHTTPResult *) result { id results = result.object; self.token = results[@"access_token"]; id expires = results[@"expires_in"]; self.tokenExpirationDate = [NSDate dateWithTimeIntervalSinceNow:[expires intValue]]; return [self isAuthenticated]; } - (BOOL) isAuthenticated { return (self.token && self.tokenExpirationDate && ([self.tokenExpirationDate compare:[NSDate date]] == NSOrderedDescending)); } #pragma mark - Management API request generators - #pragma mark Access tokens // http://apigee.com/docs/usergrid/content/accesstoken - (NSMutableURLRequest *) getAccessTokenForAdminWithUsername:(NSString *) username password:(NSString *) password { if (!username || !password) { return nil; } NSDictionary *query = @{@"grant_type":@"password", @"username":username, @"password":password}; NSString *path = [NSMutableString stringWithFormat:@"%@/management/token?%@", self.server, [query URLQueryString]]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) getAccessTokenForOrganizationWithClientID:(NSString *) clientID clientSecret:(NSString *) clientSecret { if (!clientID || !clientSecret) { return nil; } NSDictionary *query = @{@"grant_type":@"client_credentials", @"client_id":clientID, @"client_secret":clientSecret}; NSString *path = [NSMutableString stringWithFormat:@"%@/management/token?%@", self.server, [query URLQueryString]]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) getAccessTokenForApplicationWithUsername:(NSString *) username password:(NSString *) password { if (!username || !password) { return nil; } NSDictionary *query = @{@"grant_type":@"password", @"username":username, @"password":password}; NSString *path = [NSMutableString stringWithFormat:@"%@/token?%@", self.root, [query URLQueryString]]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) getAccessTokenForApplicationWithClientID:(NSString *) clientID clientSecret:(NSString *) clientSecret { if (!clientID || !clientSecret) { return nil; } NSDictionary *query = @{@"grant_type":@"client_credentials", @"client_id":clientID, @"client_secret":clientSecret}; NSString *path = [NSMutableString stringWithFormat:@"%@/token?%@", self.root, [query URLQueryString]]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } #pragma mark Admin users // http://apigee.com/docs/usergrid/content/admin-user - (NSMutableURLRequest *) createAdminUserWithValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/management/users", self.server]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) updateAdminUser:(NSString *) adminUserIdentifier withValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/management/users/%@", self.server, adminUserIdentifier]; return [self authorizedRequestWithMethod:@"PUT" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) getAdminUser:(NSString *) adminUserIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/users/%@", self.server, adminUserIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) setPasswordForAdminUser:(NSString *) adminUserIdentifier toValue:(NSString *) password { NSString *path = [NSString stringWithFormat:@"%@/management/users/%@/password", self.server, adminUserIdentifier]; NSDictionary *values = @{@"password":password}; return [self authorizedRequestWithMethod:@"PUT" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) initiatePasswordResetForAdminUser { NSString *path = [NSString stringWithFormat:@"%@/management/users/resetpw", self.server]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) completePasswordResetForAdminUserWithValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/management/users/resetpw", self.server]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) activateAdminUser:(NSString *) adminUserIdentifier withToken:(NSString *) token sendingConfirmationEmail:(BOOL) sendingConfirmationEmail { NSString *path = [NSString stringWithFormat:@"%@/management/users/%@/activate", self.server, adminUserIdentifier]; NSDictionary *values = @{@"token":token, @"confirm_email":boolean_representation(sendingConfirmationEmail)}; return [self authorizedRequestWithMethod:@"GET" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) reactivateAdminUser:(NSString *) adminUserIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/users/%@/reactivate", self.server, adminUserIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) getActivityFeedForAdminUser:(NSString *) adminUserIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/users/%@/feed", self.server, adminUserIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } #pragma mark Client authorization // http://apigee.com/docs/usergrid/content/client-authorization - (NSMutableURLRequest *) authorizeClient:(NSString *) clientIdentifier withResponseType:(NSString *) responseType { NSString *path = [NSString stringWithFormat:@"%@/management/authorize", self.server]; NSDictionary *values = @{@"response_type":responseType, @"client_id":clientIdentifier}; return [self authorizedRequestWithMethod:@"GET" path:path body:[values URLQueryData]]; } #pragma mark Organizations and Applications // http://apigee.com/docs/usergrid/content/organization - (NSMutableURLRequest *) createOrganizationWithValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/management/organizations", self.server]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) getOrganization:(NSString *) organizationIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@", self.server, organizationIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) activateOrganization:(NSString *) organizationIdentifier withToken:(NSString *) token sendingConfirmationEmail:(BOOL) sendingConfirmationEmail { NSDictionary *values = @{@"token":token, @"confirm_email":boolean_representation(sendingConfirmationEmail)}; NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/activate?%@", self.server, organizationIdentifier, [values URLQueryString]]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) reactivateOrganization:(NSString *) organizationIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/reactivate", self.server, organizationIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) generateClientCredentialsForOrganization:(NSString *) organizationIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/credentials", self.server, organizationIdentifier]; return [self authorizedRequestWithMethod:@"POST" path:path body:nil]; } - (NSMutableURLRequest *) getClientCredentialsForOrganization:(NSString *) organizationIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/credentials", self.server, organizationIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) getActivityFeedForOrganization:(NSString *) organizationIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/feed", self.server, organizationIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) createApplicationInOrganization:(NSString *)organizationIdentifier withValues:(NSDictionary *)values { NSString *path = [NSMutableString stringWithFormat:@"%@/management/organizations/%@/applications", self.server, organizationIdentifier]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) deleteApplication:(NSString *) applicationIdentifier inOrganization:(NSString *)organizationIdentifier { NSString *path = [NSMutableString stringWithFormat:@"%@/management/organizations/%@/applications/%@", self.server, organizationIdentifier, applicationIdentifier]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } - (NSMutableURLRequest *) generateClientCredentialsForApplication:(NSString *) applicationIdentifier inOrganization:(NSString *) organizationIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/applications/%@/credentials", self.server, organizationIdentifier, applicationIdentifier]; return [self authorizedRequestWithMethod:@"POST" path:path body:nil]; } - (NSMutableURLRequest *) getClientCredentialsForApplication:(NSString *) applicationIdentifier inOrganization:(NSString *) organizationIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/applications/%@/credentials", self.server, organizationIdentifier, applicationIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) getApplicationsInOrganization:(NSString *) organizationIdentifier { NSString *path = [NSMutableString stringWithFormat:@"%@/management/organizations/%@/applications", self.server, organizationIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) addAdminUser:(NSString *) adminUserIdentifier toOrganization:(NSString *) organizationIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/users/%@", self.server, organizationIdentifier, adminUserIdentifier]; return [self authorizedRequestWithMethod:@"PUT" path:path body:nil]; } - (NSMutableURLRequest *) getAdminUsersInOrganization:(NSString *) organizationIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/users", self.server, organizationIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) removeAdminUser:(NSString *) adminUserIdentifier fromOrganization:(NSString *) organizationIdentifier { NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/users/%@", self.server, organizationIdentifier, adminUserIdentifier]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } - (NSMutableURLRequest *) getApplication:(NSString *) applicationIdentifier inOrganization:(NSString *) organizationIdentifier { NSString *path = [NSMutableString stringWithFormat:@"%@/%@/%@", self.server, organizationIdentifier, applicationIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } #pragma mark - Application API request generators - #pragma mark Activity // http://apigee.com/docs/usergrid/content/activity - (NSMutableURLRequest *) createActivityForUser:(NSString *) userIdentifier withValues:(NSDictionary *) values { NSString *path = [NSMutableString stringWithFormat:@"%@/users/%@/activities", self.root, userIdentifier]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) createActivityForGroup:(NSString *) groupIdentifier withValues:(NSDictionary *) values { NSString *path = [NSMutableString stringWithFormat:@"%@/groups/%@/activities", self.root, groupIdentifier]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) createActivityForFollowersOfUser:(NSString *) userIdentifier inGroup:(NSString *) groupIdentifier withValues:(NSDictionary *) values { NSString *path = [NSMutableString stringWithFormat:@"%@/groups/%@/users/%@/activities", self.root, groupIdentifier, userIdentifier]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) getActivitiesForUser:(NSString *) userIdentifier { NSString *path = [NSMutableString stringWithFormat:@"%@/users/%@/activities", self.root, userIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) getActivitiesForGroup:(NSString *) groupIdentifier { NSString *path = [NSMutableString stringWithFormat:@"%@/groups/%@/activities", self.root, groupIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) getActivityFeedForUser:(NSString *) userIdentifier { NSString *path = [NSMutableString stringWithFormat:@"%@/users/%@/feed", self.root, userIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) getActivityFeedForGroup:(NSString *) groupIdentifier { NSString *path = [NSMutableString stringWithFormat:@"%@/groups/%@/feed", self.root, groupIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } #pragma mark Assets - (NSMutableURLRequest *) getDataForAsset:(NSString *) assetIdentifier { NSString *path = [NSMutableString stringWithFormat:@"%@/assets/%@/data", self.root, assetIdentifier]; NSMutableURLRequest *request = [self authorizedRequestWithMethod:@"GET" path:path body:nil]; return request; } - (NSMutableURLRequest *) postData:(NSData *) data forAsset:(NSString *) assetIdentifier { NSString *path = [NSMutableString stringWithFormat:@"%@/assets/%@/data", self.root, assetIdentifier]; NSMutableURLRequest *request = [self authorizedRequestWithMethod:@"POST" path:path body:data]; [request setValue:@"application/octet-stream" forHTTPHeaderField:@"Content-Type"]; return request; } #pragma mark General-purpose endpoints // http://apigee.com/docs/usergrid/content/general-purpose-endpoints - (NSMutableURLRequest *) createEntityInCollection:(NSString *) collection withValues:(NSDictionary *)values { NSString *path = [NSMutableString stringWithFormat:@"%@/%@", self.root, collection]; NSError *error; NSData *data = [NSJSONSerialization dataWithJSONObject:values options:0 error:&error]; if (!data) { NSLog(@"%@", error); } return [self authorizedRequestWithMethod:@"POST" path:path body:data]; } - (NSMutableURLRequest *) getEntity:(NSString *) entityIdentifier inCollection:(NSString *) collection { NSString *path = [NSMutableString stringWithFormat:@"%@/%@/%@", self.root, collection, entityIdentifier]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) updateEntity:(NSString *) entityIdentifier inCollection:(NSString *) collection withValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/%@/%@", self.root, collection, entityIdentifier]; NSError *error; NSData *data = [NSJSONSerialization dataWithJSONObject:values options:0 error:&error]; if (!data) { NSLog(@"%@", error); } return [self authorizedRequestWithMethod:@"PUT" path:path body:data]; } - (NSMutableURLRequest *) deleteEntity:(NSString *) entityIdentifier inCollection:(NSString *) collection { NSString *path = [NSString stringWithFormat:@"%@/%@/%@", self.root, collection, entityIdentifier]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } - (NSMutableURLRequest *) getEntitiesInCollection:(NSString *) collection limit:(int) limit { NSDictionary *query = [self queryWithString:@"select *" limit:limit startUUID:nil cursor:nil reversed:NO]; return [self getEntitiesInCollection:collection usingQuery:query]; } - (NSMutableURLRequest *) getEntitiesInCollection:(NSString *) collection usingQuery:(NSDictionary *) query { NSString *path = [NSMutableString stringWithFormat:@"%@/%@?%@", self.root, collection, [query URLQueryString]]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) updateEntitiesInCollection:(NSString *) collection usingQuery:(NSDictionary *) query withValues:(NSDictionary *) values { NSString *path = [NSMutableString stringWithFormat:@"%@/%@?%@", self.root, collection, [query URLQueryString]]; return [self authorizedRequestWithMethod:@"PUT" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) deleteEntitiesInCollection:(NSString *) collection { NSDictionary *query = [self queryWithString:@"select *" limit:0 startUUID:nil cursor:nil reversed:NO]; return [self deleteEntitiesInCollection:collection usingQuery:query]; } - (NSMutableURLRequest *) deleteEntitiesInCollection:(NSString *) collection usingQuery:(NSDictionary *) query { NSString *path = [NSString stringWithFormat:@"%@/%@?%@", self.root, collection, [query URLQueryString]]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } #pragma mark Devices // http://apigee.com/docs/usergrid/content/device #pragma mark Events and Counters // http://apigee.com/docs/usergrid/content/events-and-counters - (NSMutableURLRequest *) createEventWithValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/events", self.root]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } #pragma mark Groups // http://apigee.com/docs/usergrid/content/group - (NSMutableURLRequest *) createGroupWithValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/groups", self.root]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) addUser:(NSString *) user toGroup:(NSString *) group { NSString *path = [NSString stringWithFormat:@"%@/groups/%@/users/%@", self.root, group, user]; return [self authorizedRequestWithMethod:@"POST" path:path body:nil]; } - (NSMutableURLRequest *) getGroup:(NSString *) groupName { NSString *path = [NSString stringWithFormat:@"%@/groups/%@", self.root, groupName]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) updateGroup:(NSString *) groupName withValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/groups/%@", self.root, groupName]; return [self authorizedRequestWithMethod:@"PUT" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) deleteUser:(NSString *) user fromGroup:(NSString *) groupName { NSString *path = [NSString stringWithFormat:@"%@/groups/%@/users/%@", self.root, groupName, user]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } - (NSMutableURLRequest *) deleteGroup:(NSString *) groupName { NSString *path = [NSString stringWithFormat:@"%@/groups/%@", self.root, groupName]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } - (NSMutableURLRequest *) getUsersInGroup:(NSString *) groupName { NSString *path = [NSString stringWithFormat:@"%@/groups/%@/users", self.root, groupName]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } #pragma mark Roles // http://apigee.com/docs/usergrid/content/role - (NSMutableURLRequest *) createRoleWithValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/roles", self.root]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) getRoles { NSString *path = [NSString stringWithFormat:@"%@/roles", self.root]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) deleteRole:(NSString *) roleName { NSString *path = [NSString stringWithFormat:@"%@/roles/%@", self.root, roleName]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } - (NSMutableURLRequest *) getPermissionsForRole:(NSString *) roleName { NSString *path = [NSString stringWithFormat:@"%@/roles/%@", self.root, roleName]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) addPermissionsToRole:(NSString *) roleName withValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/roles/%@/permissions", self.root, roleName]; return [self authorizedRequestWithMethod:@"POST" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) deletePermissionsFromRole:(NSString *) roleName usingPattern:(NSString *) pattern { NSString *path = [NSString stringWithFormat:@"%@/roles/%@/permissions?pattern=%@", self.root, roleName, pattern]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } - (NSMutableURLRequest *) addUser:(NSString *)user toRole:(NSString *)roleName { NSString *path = [NSString stringWithFormat:@"%@/roles/%@/users/%@", self.root, roleName, user]; return [self authorizedRequestWithMethod:@"POST" path:path body:nil]; } - (NSMutableURLRequest *) getUsersInRole:(NSString *) roleName { NSString *path = [NSString stringWithFormat:@"%@/roles/%@/users", self.root, roleName]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) deleteUser:(NSString *) user fromRole:(NSString *) roleName { NSString *path = [NSString stringWithFormat:@"%@/roles/%@/users/%@", self.root, roleName, user]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } #pragma mark Users // http://apigee.com/docs/usergrid/content/user - (NSMutableURLRequest *) createUserWithValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/users", self.root]; return [self authorizedRequestWithMethod:@"GET" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) setPasswordForUser:(NSString *) username toPassword:(NSString *) newPassword fromPassword:(NSString *) oldPassword { NSDictionary *query = @{@"newpassword":newPassword, @"oldpassword":oldPassword}; NSString *path = [NSString stringWithFormat:@"%@/users/%@/password", self.root, username]; return [self authorizedRequestWithMethod:@"POST" path:path body:[query URLQueryData]]; } - (NSMutableURLRequest *) getUser:(NSString *) username { NSString *path = [NSString stringWithFormat:@"%@/users/%@", self.root, username]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) updateUser:(NSString *) username withValues:(NSDictionary *) values { NSString *path = [NSString stringWithFormat:@"%@/users/%@", self.root, username]; return [self authorizedRequestWithMethod:@"PUT" path:path body:[values URLQueryData]]; } - (NSMutableURLRequest *) deleteUser:(NSString *) username { NSString *path = [NSString stringWithFormat:@"%@/users/%@", self.root, username]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } - (NSMutableURLRequest *) getUsersUsingQuery:(NSDictionary *) query { NSString *path = [NSString stringWithFormat:@"%@/users?%@", self.root, [query URLQueryString]]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } - (NSMutableURLRequest *) connectEntity:(NSString *) entity1 inCollection:(NSString *) collection toEntity:(NSString *) entity2 throughRelationship:(NSString *) relationship { NSString *path = [NSString stringWithFormat:@"%@/%@/%@/%@/%@", self.root, collection, entity1, relationship, entity2]; return [self authorizedRequestWithMethod:@"POST" path:path body:nil]; } - (NSMutableURLRequest *) disconnectEntity:(NSString *) entity1 inCollection:(NSString *) collection fromEntity:(NSString *) entity2 throughRelationship:(NSString *) relationship { NSString *path = [NSString stringWithFormat:@"%@/%@/%@/%@/%@", self.root, collection, entity1, relationship, entity2]; return [self authorizedRequestWithMethod:@"DELETE" path:path body:nil]; } - (NSMutableURLRequest *) getConnectionsToEntity:(NSString *) entity inCollection:(NSString *) collection throughRelationship:(NSString *) relationship usingQuery:(NSDictionary *) query { NSString *path = [NSString stringWithFormat:@"%@/%@/%@/%@?%@", self.root, collection, entity, relationship, [query URLQueryString]]; return [self authorizedRequestWithMethod:@"GET" path:path body:nil]; } @end