/WordPress/Classes/Networking/TaxonomyServiceRemoteREST.m

https://gitlab.com/jslee1/WordPress-iOS · Objective C · 261 lines · 229 code · 32 blank · 0 comment · 21 complexity · 79e9998c68be004bd95f0414a991a7e5 MD5 · raw file

  1. #import "TaxonomyServiceRemoteREST.h"
  2. #import "WordPress-Swift.h"
  3. #import "RemotePostCategory.h"
  4. #import "RemotePostTag.h"
  5. #import "RemoteTaxonomyPaging.h"
  6. NS_ASSUME_NONNULL_BEGIN
  7. static NSString * const TaxonomyRESTCategoryIdentifier = @"categories";
  8. static NSString * const TaxonomyRESTTagIdentifier = @"tags";
  9. static NSString * const TaxonomyRESTIDParameter = @"ID";
  10. static NSString * const TaxonomyRESTNameParameter = @"name";
  11. static NSString * const TaxonomyRESTSlugParameter = @"slug";
  12. static NSString * const TaxonomyRESTParentParameter = @"parent";
  13. static NSString * const TaxonomyRESTSearchParameter = @"search";
  14. static NSString * const TaxonomyRESTOrderParameter = @"order";
  15. static NSString * const TaxonomyRESTOrderByParameter = @"order_by";
  16. static NSString * const TaxonomyRESTNumberParameter = @"number";
  17. static NSString * const TaxonomyRESTOffsetParameter = @"offset";
  18. static NSString * const TaxonomyRESTPageParameter = @"page";
  19. @implementation TaxonomyServiceRemoteREST
  20. #pragma mark - categories
  21. - (void)createCategory:(RemotePostCategory *)category
  22. success:(nullable void (^)(RemotePostCategory *))success
  23. failure:(nullable void (^)(NSError *))failure
  24. {
  25. NSParameterAssert(category.name.length > 0);
  26. NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
  27. parameters[TaxonomyRESTNameParameter] = category.name;
  28. if (category.parentID) {
  29. parameters[TaxonomyRESTParentParameter] = category.parentID;
  30. }
  31. [self createTaxonomyWithType:TaxonomyRESTCategoryIdentifier
  32. parameters:parameters
  33. success:^(NSDictionary *taxonomyDictionary) {
  34. RemotePostCategory *receivedCategory = [self remoteCategoryWithJSONDictionary:taxonomyDictionary];
  35. if (success) {
  36. success(receivedCategory);
  37. }
  38. } failure:failure];
  39. }
  40. - (void)getCategoriesWithSuccess:(void (^)(NSArray <RemotePostCategory *> *))success
  41. failure:(nullable void (^)(NSError *))failure
  42. {
  43. [self getTaxonomyWithType:TaxonomyRESTCategoryIdentifier
  44. parameters:nil
  45. success:^(NSDictionary *responseObject) {
  46. success([self remoteCategoriesWithJSONArray:[responseObject arrayForKey:TaxonomyRESTCategoryIdentifier]]);
  47. } failure:failure];
  48. }
  49. - (void)getCategoriesWithPaging:(RemoteTaxonomyPaging *)paging
  50. success:(void (^)(NSArray <RemotePostCategory *> *categories))success
  51. failure:(nullable void (^)(NSError *error))failure
  52. {
  53. [self getTaxonomyWithType:TaxonomyRESTCategoryIdentifier
  54. parameters:[self parametersForPaging:paging]
  55. success:^(NSDictionary *responseObject) {
  56. success([self remoteCategoriesWithJSONArray:[responseObject arrayForKey:TaxonomyRESTCategoryIdentifier]]);
  57. } failure:failure];
  58. }
  59. - (void)searchCategoriesWithName:(NSString *)nameQuery
  60. success:(void (^)(NSArray <RemotePostCategory *> *tags))success
  61. failure:(nullable void (^)(NSError *error))failure
  62. {
  63. NSParameterAssert(nameQuery.length > 0);
  64. [self getTaxonomyWithType:TaxonomyRESTCategoryIdentifier
  65. parameters:@{TaxonomyRESTSearchParameter: nameQuery}
  66. success:^(NSDictionary *responseObject) {
  67. success([self remoteCategoriesWithJSONArray:[responseObject arrayForKey:TaxonomyRESTCategoryIdentifier]]);
  68. } failure:failure];
  69. }
  70. #pragma mark - tags
  71. - (void)createTag:(RemotePostTag *)tag
  72. success:(nullable void (^)(RemotePostTag *tag))success
  73. failure:(nullable void (^)(NSError *error))failure
  74. {
  75. NSParameterAssert(tag.name.length > 0);
  76. NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
  77. parameters[TaxonomyRESTNameParameter] = tag.name;
  78. [self createTaxonomyWithType:TaxonomyRESTTagIdentifier
  79. parameters:parameters
  80. success:^(NSDictionary *taxonomyDictionary) {
  81. RemotePostTag *receivedTag = [self remoteTagWithJSONDictionary:taxonomyDictionary];
  82. if (success) {
  83. success(receivedTag);
  84. }
  85. } failure:failure];
  86. }
  87. - (void)getTagsWithSuccess:(void (^)(NSArray <RemotePostTag *> *tags))success
  88. failure:(nullable void (^)(NSError *error))failure
  89. {
  90. [self getTaxonomyWithType:TaxonomyRESTTagIdentifier
  91. parameters:nil
  92. success:^(NSDictionary *responseObject) {
  93. success([self remoteTagsWithJSONArray:[responseObject arrayForKey:TaxonomyRESTTagIdentifier]]);
  94. } failure:failure];
  95. }
  96. - (void)getTagsWithPaging:(RemoteTaxonomyPaging *)paging
  97. success:(void (^)(NSArray <RemotePostTag *> *tags))success
  98. failure:(nullable void (^)(NSError *error))failure
  99. {
  100. [self getTaxonomyWithType:TaxonomyRESTTagIdentifier
  101. parameters:[self parametersForPaging:paging]
  102. success:^(NSDictionary *responseObject) {
  103. success([self remoteTagsWithJSONArray:[responseObject arrayForKey:TaxonomyRESTTagIdentifier]]);
  104. } failure:failure];
  105. }
  106. - (void)searchTagsWithName:(NSString *)nameQuery
  107. success:(void (^)(NSArray <RemotePostTag *> *tags))success
  108. failure:(nullable void (^)(NSError *error))failure
  109. {
  110. NSParameterAssert(nameQuery.length > 0);
  111. [self getTaxonomyWithType:TaxonomyRESTTagIdentifier
  112. parameters:@{TaxonomyRESTSearchParameter: nameQuery}
  113. success:^(NSDictionary *responseObject) {
  114. success([self remoteTagsWithJSONArray:[responseObject arrayForKey:TaxonomyRESTTagIdentifier]]);
  115. } failure:failure];
  116. }
  117. #pragma mark - default methods
  118. - (void)createTaxonomyWithType:(NSString *)typeIdentifier
  119. parameters:(nullable NSDictionary *)parameters
  120. success:(void (^)(NSDictionary *taxonomyDictionary))success
  121. failure:(nullable void (^)(NSError *error))failure
  122. {
  123. NSString *path = [NSString stringWithFormat:@"sites/%@/%@/new?context=edit", self.siteID, typeIdentifier];
  124. NSString *requestUrl = [self pathForEndpoint:path withVersion:ServiceRemoteRESTApiVersion_1_1];
  125. [self.wordPressComRestApi POST:requestUrl
  126. parameters:parameters
  127. success:^(id _Nonnull responseObject, NSHTTPURLResponse *httpResponse) {
  128. if (![responseObject isKindOfClass:[NSDictionary class]]) {
  129. NSString *message = [NSString stringWithFormat:@"Invalid response creating taxonomy of type: %@", typeIdentifier];
  130. [self handleResponseErrorWithMessage:message url:requestUrl failure:failure];
  131. return;
  132. }
  133. success(responseObject);
  134. } failure:^(NSError * _Nonnull error, NSHTTPURLResponse *httpResponse) {
  135. if (failure) {
  136. failure(error);
  137. }
  138. }];
  139. }
  140. - (void)getTaxonomyWithType:(NSString *)typeIdentifier
  141. parameters:(nullable NSDictionary *)parameters
  142. success:(void (^)(NSDictionary *responseObject))success
  143. failure:(nullable void (^)(NSError *error))failure
  144. {
  145. NSString *path = [NSString stringWithFormat:@"sites/%@/%@?context=edit", self.siteID, typeIdentifier];
  146. NSString *requestUrl = [self pathForEndpoint:path
  147. withVersion:ServiceRemoteRESTApiVersion_1_1];
  148. [self.wordPressComRestApi GET:requestUrl
  149. parameters:parameters
  150. success:^(id _Nonnull responseObject, NSHTTPURLResponse *httpResponse) {
  151. if (![responseObject isKindOfClass:[NSDictionary class]]) {
  152. NSString *message = [NSString stringWithFormat:@"Invalid response requesting taxonomy of type: %@", typeIdentifier];
  153. [self handleResponseErrorWithMessage:message url:requestUrl failure:failure];
  154. return;
  155. }
  156. success(responseObject);
  157. } failure:^(NSError * _Nonnull error, NSHTTPURLResponse *httpResponse) {
  158. if (failure) {
  159. failure(error);
  160. }
  161. }];
  162. }
  163. #pragma mark - helpers
  164. - (NSArray <RemotePostCategory *> *)remoteCategoriesWithJSONArray:(NSArray *)jsonArray
  165. {
  166. return [jsonArray wp_map:^id(NSDictionary *jsonCategory) {
  167. return [self remoteCategoryWithJSONDictionary:jsonCategory];
  168. }];
  169. }
  170. - (RemotePostCategory *)remoteCategoryWithJSONDictionary:(NSDictionary *)jsonCategory
  171. {
  172. RemotePostCategory *category = [RemotePostCategory new];
  173. category.categoryID = [jsonCategory numberForKey:TaxonomyRESTIDParameter];
  174. category.name = [jsonCategory stringForKey:TaxonomyRESTNameParameter];
  175. category.parentID = [jsonCategory numberForKey:TaxonomyRESTParentParameter];
  176. return category;
  177. }
  178. - (NSArray <RemotePostTag *> *)remoteTagsWithJSONArray:(NSArray *)jsonArray
  179. {
  180. return [jsonArray wp_map:^id(NSDictionary *jsonTag) {
  181. return [self remoteTagWithJSONDictionary:jsonTag];
  182. }];
  183. }
  184. - (RemotePostTag *)remoteTagWithJSONDictionary:(NSDictionary *)jsonTag
  185. {
  186. RemotePostTag *tag = [RemotePostTag new];
  187. tag.tagID = [jsonTag numberForKey:TaxonomyRESTIDParameter];
  188. tag.name = [jsonTag stringForKey:TaxonomyRESTNameParameter];
  189. tag.slug = [jsonTag stringForKey:TaxonomyRESTSlugParameter];
  190. return tag;
  191. }
  192. - (NSDictionary *)parametersForPaging:(RemoteTaxonomyPaging *)paging
  193. {
  194. NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
  195. if (paging.number) {
  196. [dictionary setObject:paging.number forKey:TaxonomyRESTNumberParameter];
  197. }
  198. if (paging.offset) {
  199. [dictionary setObject:paging.offset forKey:TaxonomyRESTOffsetParameter];
  200. }
  201. if (paging.page) {
  202. [dictionary setObject:paging.page forKey:TaxonomyRESTPageParameter];
  203. }
  204. if (paging.order == RemoteTaxonomyPagingOrderAscending) {
  205. [dictionary setObject:@"ASC" forKey:TaxonomyRESTOrderParameter];
  206. } else if (paging.order == RemoteTaxonomyPagingOrderDescending) {
  207. [dictionary setObject:@"DESC" forKey:TaxonomyRESTOrderParameter];
  208. }
  209. if (paging.orderBy == RemoteTaxonomyPagingResultsOrderingByName) {
  210. [dictionary setObject:@"name" forKey:TaxonomyRESTOrderByParameter];
  211. } else if (paging.orderBy == RemoteTaxonomyPagingResultsOrderingByCount) {
  212. [dictionary setObject:@"count" forKey:TaxonomyRESTOrderByParameter];
  213. }
  214. return dictionary.count ? dictionary : nil;
  215. }
  216. - (void)handleResponseErrorWithMessage:(NSString *)message
  217. url:(NSString *)urlStr
  218. failure:(nullable void(^)(NSError *error))failure
  219. {
  220. DDLogError(@"%@ - URL: %@", message, urlStr);
  221. NSError *error = [NSError errorWithDomain:NSURLErrorDomain
  222. code:NSURLErrorBadServerResponse
  223. userInfo:@{NSLocalizedDescriptionKey: message}];
  224. if (failure) {
  225. failure(error);
  226. }
  227. }
  228. @end
  229. NS_ASSUME_NONNULL_END