diff --git a/OAuthSDK/YMAPIClient.h b/OAuthSDK/YMAPIClient.h index 7cb4f0b..2cf317d 100644 --- a/OAuthSDK/YMAPIClient.h +++ b/OAuthSDK/YMAPIClient.h @@ -7,7 +7,7 @@ #import #import "AFNetworking.h" -extern NSString * const YMBaseURL; +FOUNDATION_EXPORT NSString * const YMBaseURL; /** Represents an object that contains a queue of HTTP operations. @@ -40,4 +40,12 @@ extern NSString * const YMBaseURL; */ - (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id responseObject))success failure:(void (^)(NSInteger statusCode, NSError *error))failure; +/** + Retrieves the currently logged in user's groups + @param page Which page of 50 groups to return + @param success The success block + @param failure The failure block + */ +- (void)groupsForCurrentUserWithPage:(NSUInteger)page success:(void (^)(NSArray *groups))success failure:(void (^)(NSError *error))failure; + @end diff --git a/OAuthSDK/YMAPIClient.m b/OAuthSDK/YMAPIClient.m index 4e455f4..8b7b11e 100644 --- a/OAuthSDK/YMAPIClient.m +++ b/OAuthSDK/YMAPIClient.m @@ -7,6 +7,7 @@ #import "YMLoginClient.h" #import "YMAPIClient.h" #import "NSURL+YMQueryParameters.h" +#import "YMGroup.h" #import NSString * const YMBaseURL = @"https://www.yammer.com"; @@ -122,4 +123,25 @@ - (void)postPath:(NSString *)path }]; } +- (void)groupsForCurrentUserWithPage:(NSUInteger)page + success:(void (^)(NSArray *groups))success + failure:(void (^)(NSError *error))failure +{ + NSString *path = @"/api/v1/groups"; + + NSDictionary *parameters = @{ + @"mine" : @YES, + @"page" : @(page) + }; + + [self.sessionManager GET:path parameters:parameters success:^(NSURLSessionDataTask *task, NSArray *responseObject) { + NSError *error; + NSArray *groups = [MTLJSONAdapter modelsOfClass:YMGroup.class fromJSONArray:responseObject error:&error]; + + success(groups); + } failure:^(NSURLSessionDataTask *task, NSError *error) { + failure(error); + }]; +} + @end diff --git a/OAuthSDK/YMGroup.h b/OAuthSDK/YMGroup.h new file mode 100644 index 0000000..de51903 --- /dev/null +++ b/OAuthSDK/YMGroup.h @@ -0,0 +1,39 @@ +// +// YMGroup.h +// Pods +// +// Created by Peter Willsey on 6/3/15. +// +// + +#import +#import +#import + +@interface YMGroup : MTLModel + +@property (nonatomic, strong, readonly) NSDate *createdAt; +@property (nonatomic, assign, readonly) NSUInteger creatorID; +@property (nonatomic, copy, readonly) NSString *creatorType; +@property (nonatomic, copy, readonly) NSString *groupDescription; +@property (nonatomic, copy, readonly) NSString *fullName; +@property (nonatomic, assign, readonly) NSUInteger groupID; +@property (nonatomic, copy, readonly) NSString *mugshotID; +@property (nonatomic, strong, readonly) NSURL *mugshotURL; +@property (nonatomic, copy, readonly) NSString *mugshotURLTemplate; +@property (nonatomic, copy, readonly) NSString *name; +@property (nonatomic, assign, readonly) NSUInteger networkID; +@property (nonatomic, strong, readonly) NSURL *office365URL; +@property (nonatomic, copy, readonly) NSString *privacy; +@property (nonatomic, assign, readonly) BOOL showInDirectory; +@property (nonatomic, copy, readonly) NSString *state; +@property (nonatomic, strong, readonly) NSDate *lastMessageAt; +@property (nonatomic, assign, readonly) NSUInteger lastMessageID; +@property (nonatomic, assign, readonly) NSUInteger members; +@property (nonatomic, assign, readonly) NSUInteger updates; +@property (nonatomic, strong, readonly) NSURL *URL; +@property (nonatomic, strong, readonly) NSURL *webURL; + +- (id)objectForKeyedSubscript:(NSString *)key; + +@end diff --git a/OAuthSDK/YMGroup.m b/OAuthSDK/YMGroup.m new file mode 100644 index 0000000..763ea9b --- /dev/null +++ b/OAuthSDK/YMGroup.m @@ -0,0 +1,107 @@ +// +// YMGroup.m +// Pods +// +// Created by Peter Willsey on 6/3/15. +// +// + +#import "YMGroup.h" +#import +#import + +@implementation YMGroup + ++ (NSDateFormatter *)dateFormatter { + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss Z "; + return dateFormatter; +} + ++ (NSDictionary *)JSONKeyPathsByPropertyKey +{ + return @{ + @"createdAt" : @"created_at", + @"creatorID" : @"creator_id", + @"creatorType" : @"creator_type", + @"groupDescription" : @"description", + @"fullName" : @"full_name", + @"groupID" : @"id", + @"mugshotID" : @"mugshot_id", + @"mugshotURL" : @"mugshot_url", + @"mugshotURLTemplate" : @"mugshot_url_template", + @"name" : @"name", + @"networkID" : @"network_id", + @"office365URL" : @"office365_url", + @"privacy" : @"privacy", + @"showInDirectory" : @"show_in_directory", + @"state" : @"state", + @"lastMessageAt" : @"stats.last_message_at", + @"lastMessageID" : @"stats.last_message_id", + @"members" : @"stats.members", + @"updates" : @"stats.updates", + @"URL" : @"url", + @"webURL" : @"web_url" + }; +} + ++ (NSValueTransformer *)standardDateJSONTransformer +{ + return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *value, BOOL *success, NSError *__autoreleasing *error) { + return [self.dateFormatter dateFromString:value]; + } reverseBlock:^id(NSDate *value, BOOL *success, NSError *__autoreleasing *error) { + return [self.dateFormatter stringFromDate:value]; + }]; +} + ++ (NSValueTransformer *)createdAtJSONTransformer +{ + return [self.class standardDateJSONTransformer]; +} + ++ (NSValueTransformer *)mugshotURLJSONTransformer +{ + return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName]; +} + ++ (NSValueTransformer *)office365URLJSONTransformer +{ + return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName]; +} + ++ (NSValueTransformer *)showInDirectoryJSONTransformer +{ + return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *value, BOOL *success, NSError *__autoreleasing *error) { + if ([value isKindOfClass:[NSString class]]) { + return ([value isEqualToString:@"true"]) ? @YES : @NO; + } else { + *success = NO; + return nil; + } + } reverseBlock:^id(NSNumber *value, BOOL *success, NSError *__autoreleasing *error) { + return ([value boolValue]) ? @"true" : @"false"; + }]; +} + ++ (NSValueTransformer *)lastMessageAtJSONTransformer +{ + return [self.class standardDateJSONTransformer]; +} + ++ (NSValueTransformer *)URLJSONTransformer +{ + return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName]; +} + ++ (NSValueTransformer *)webURLJSONTransformer +{ + return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName]; +} + +- (id)objectForKeyedSubscript:(NSString *)key +{ + return key ? self.dictionaryValue[key] : nil; +} + +@end diff --git a/OAuthSDK/YMLoginClient.h b/OAuthSDK/YMLoginClient.h index d8f444c..3071c69 100644 --- a/OAuthSDK/YMLoginClient.h +++ b/OAuthSDK/YMLoginClient.h @@ -5,11 +5,11 @@ #import -extern NSString * const YMYammerSDKLoginDidCompleteNotification; -extern NSString * const YMYammerSDKLoginDidFailNotification; +FOUNDATION_EXPORT NSString * const YMYammerSDKLoginDidCompleteNotification; +FOUNDATION_EXPORT NSString * const YMYammerSDKLoginDidFailNotification; -extern NSString * const YMYammerSDKAuthTokenUserInfoKey; -extern NSString * const YMYammerSDKErrorUserInfoKey; +FOUNDATION_EXPORT NSString * const YMYammerSDKAuthTokenUserInfoKey; +FOUNDATION_EXPORT NSString * const YMYammerSDKErrorUserInfoKey; @protocol YMLoginClientDelegate; diff --git a/YammerSDK.podspec b/YammerSDK.podspec index 8da30f3..dbd075f 100644 --- a/YammerSDK.podspec +++ b/YammerSDK.podspec @@ -13,4 +13,5 @@ Pod::Spec.new do |s| s.dependency 'AFNetworking', '~> 2.0' s.dependency 'PDKeychainBindingsController' + s.dependency 'Mantle' end