Skip to content

Commit 0bf15cc

Browse files
author
rokkincat
committed
Updates for new JSON API spec
1 parent c2c9290 commit 0bf15cc

File tree

4 files changed

+49
-59
lines changed

4 files changed

+49
-59
lines changed

Classes/JSONAPI.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
- (id)initWithDictionary:(NSDictionary*)dictionary;
2727

2828
- (id)objectForKey:(NSString*)key;
29-
- (id)resourceForKey:(NSString*)key;
30-
- (NSArray*)resourcesForKey:(NSString*)key;
29+
- (id)resource;
30+
- (NSArray*)resources;
3131

3232
@end

Classes/JSONAPI.m

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -58,21 +58,21 @@ - (id)objectForKey:(NSString*)key {
5858
return [_dictionary objectForKey:key];
5959
}
6060

61-
- (id)resourceForKey:(NSString*)key {
61+
- (id)resource {
62+
NSString *key = @"data";
6263
if ([key isEqualToString:@"meta"] == YES || [key isEqualToString:@"linked"] == YES) {
6364
return nil;
6465
}
6566

6667
NSDictionary *rawResource = [_dictionary objectForKey:key];
6768
JSONAPIResource *resource = nil;
6869
if ([rawResource isKindOfClass:[NSDictionary class]] == YES) {
69-
Class c = [JSONAPIResourceModeler resourceForLinkedType:[JSONAPIResourceLinker linkedType:key]];
70-
resource = [JSONAPIResource jsonAPIResource:rawResource withLinked:self.linked withClass:c];
70+
resource = [JSONAPIResource jsonAPIResource:rawResource withLinked:self.linked];
7171
}
7272

7373
// Fall back to first element in array
7474
if (resource == nil) {
75-
id resources = [self resourcesForKey:key];
75+
id resources = [self resources];
7676
if ([resources isKindOfClass:[NSArray class]] == YES) {
7777
return [resources firstObject];
7878
}
@@ -82,16 +82,16 @@ - (id)resourceForKey:(NSString*)key {
8282

8383
}
8484

85-
- (NSArray*)resourcesForKey:(NSString*)key {
85+
- (NSArray*)resources {
86+
NSString *key = @"data";
8687
if ([key isEqualToString:@"meta"] == YES || [key isEqualToString:@"linked"] == YES) {
8788
return nil;
8889
}
8990

9091
NSArray *rawResources = [_dictionary objectForKey:key];
9192
NSArray *resources = nil;
9293
if ([rawResources isKindOfClass:[NSArray class]] == YES) {
93-
Class c = [JSONAPIResourceModeler resourceForLinkedType:[JSONAPIResourceLinker linkedType:key]];
94-
resources = [JSONAPIResource jsonAPIResources:rawResources withLinked:self.linked withClass:c];
94+
resources = [JSONAPIResource jsonAPIResources:rawResources withLinked:self.linked];
9595
}
9696

9797
return resources;
@@ -112,26 +112,21 @@ - (void)inflateWithDictionary:(NSDictionary*)dictionary {
112112
// Sets linked
113113
NSMutableDictionary *creatingLinked = [NSMutableDictionary dictionary];
114114
NSDictionary *rawLinked = [dictionary objectForKey:@"linked"];
115-
if ([rawLinked isKindOfClass:[NSDictionary class]] == YES) {
115+
if ([rawLinked isKindOfClass:[NSArray class]] == YES) {
116116

117117
NSMutableArray *linkedToLinkWithLinked = [NSMutableArray array];
118118

119119
// Loops through linked arrays
120-
for (NSString *key in rawLinked.allKeys) {
121-
NSArray *value = [rawLinked objectForKey:key];
120+
for (NSDictionary *resourceDictionary in rawLinked) {
122121

123-
if ([value isKindOfClass:[NSArray class]] == YES) {
124-
NSMutableDictionary *resources = [NSMutableDictionary dictionary];
125-
for (NSDictionary *resourceDictionary in value) {
126-
Class c = [JSONAPIResourceModeler resourceForLinkedType:[JSONAPIResourceLinker linkedType:key]];
127-
JSONAPIResource *resource = [JSONAPIResource jsonAPIResource:resourceDictionary withLinked:nil withClass:c];
128-
if (resource.ID != nil) {
129-
[resources setObject:resource forKey:resource.ID];
130-
[linkedToLinkWithLinked addObject:resource];
131-
}
132-
}
133-
[creatingLinked setObject:resources forKey:key];
134-
122+
NSString *type = resourceDictionary[@"type"];
123+
NSMutableDictionary *resources = creatingLinked[type] ?: @{}.mutableCopy;
124+
[creatingLinked setObject:resources forKey:type];
125+
126+
JSONAPIResource *resource = [JSONAPIResource jsonAPIResource:resourceDictionary withLinked:nil];
127+
if (resource.ID != nil) {
128+
[resources setObject:resource forKey:resource.ID];
129+
[linkedToLinkWithLinked addObject:resource];
135130
}
136131

137132
}

Classes/JSONAPIResource.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
@property (nonatomic, strong) NSDictionary *links;
1616

1717
+ (NSArray*)jsonAPIResources:(NSArray*)array withLinked:(NSDictionary*)linked;
18-
+ (NSArray*)jsonAPIResources:(NSArray*)array withLinked:(NSDictionary*)linked withClass:(Class)resourceObjectClass;
19-
2018
+ (id)jsonAPIResource:(NSDictionary*)dictionary withLinked:(NSDictionary*)linked;
21-
+ (id)jsonAPIResource:(NSDictionary*)dictionary withLinked:(NSDictionary*)linked withClass:(Class)resourceObjectClass;
2219

2320
- (id)initWithDictionary:(NSDictionary*)dict withLinked:(NSDictionary*)linked;
2421
- (void)setWithDictionary:(NSDictionary*)dict;

Classes/JSONAPIResource.m

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#import "JSONAPIResourceFormatter.h"
1212
#import "JSONAPIResourceLinker.h"
13+
#import "JSONAPIResourceModeler.h"
1314

1415
#import <objc/runtime.h>
1516
#import <objc/message.h>
@@ -29,30 +30,20 @@ @implementation JSONAPIResource
2930
#pragma mark - Class Methods
3031

3132
+ (NSArray*)jsonAPIResources:(NSArray*)array withLinked:(NSDictionary*)linked {
32-
return [JSONAPIResource jsonAPIResources:array withLinked:linked withClass:[self class]];
33-
}
34-
35-
+ (NSArray*)jsonAPIResources:(NSArray*)array withLinked:(NSDictionary*)linked withClass:(Class)resourceObjectClass {
36-
if (resourceObjectClass == nil) {
37-
resourceObjectClass = [self class];
38-
}
3933

4034
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
4135
for (NSDictionary *dict in array) {
36+
NSString *type = dict[@"type"] ?: @"";
37+
Class resourceObjectClass = [JSONAPIResourceModeler resourceForLinkedType:[JSONAPIResourceLinker linkedType:type]];
4238
[mutableArray addObject:[[resourceObjectClass alloc] initWithDictionary:dict withLinked:linked]];
4339
}
4440

4541
return mutableArray;
4642
}
4743

4844
+ (id)jsonAPIResource:(NSDictionary*)dictionary withLinked:(NSDictionary*)linked {
49-
return [JSONAPIResource jsonAPIResource:dictionary withLinked:linked withClass:[self class]];
50-
}
51-
52-
+ (id)jsonAPIResource:(NSDictionary*)dictionary withLinked:(NSDictionary*)linked withClass:(Class)resourceObjectClass {
53-
if (resourceObjectClass == nil) {
54-
resourceObjectClass = [self class];
55-
}
45+
NSString *type = dictionary[@"type"] ?: @"";
46+
Class resourceObjectClass = [JSONAPIResourceModeler resourceForLinkedType:[JSONAPIResourceLinker linkedType:type]];
5647

5748
return [[resourceObjectClass alloc] initWithDictionary:dictionary withLinked:linked];
5849
}
@@ -146,32 +137,39 @@ - (void)setWithDictionary:(NSDictionary*)dict {
146137
}
147138

148139
- (void)linkLinks:(NSDictionary*)linked {
140+
149141
// Loops through links of resources
150-
for (NSString *linkTypeUnmapped in self.links.allKeys) {
151-
152-
NSString *linkType = [JSONAPIResourceLinker linkedType:linkTypeUnmapped];
153-
if (linkType == nil) {
154-
linkType = linkTypeUnmapped;
155-
}
142+
for (NSString *linkKey in self.links.allKeys) {
156143

157144
// Gets linked objects for the resource
158-
id linksTo = [self.links objectForKey:linkTypeUnmapped];
159-
if ([linksTo isKindOfClass:[NSNumber class]] == YES || [linksTo isKindOfClass:[NSString class]] == YES) {
160-
JSONAPIResource *linkedResource = [[linked objectForKey:linkType] objectForKey:linksTo];
161-
if (linkedResource != nil) {
162-
[self.__resourceLinks setObject:linkedResource forKey:linkTypeUnmapped];
163-
}
145+
id linksTo = [self.links objectForKey:linkKey];
146+
if ([linksTo isKindOfClass:[NSDictionary class]] == YES) {
147+
148+
NSString *linkType = linksTo[@"type"];
149+
linkType = [JSONAPIResourceLinker linkedType:linkType] ?: linkType;
164150

165-
} else if ([linksTo isKindOfClass:[NSArray class]] == YES) {
166-
NSMutableArray *linkedResources = [NSMutableArray array];
167-
[self.__resourceLinks setObject:linkedResources forKey:linkTypeUnmapped];
168-
for (id linkedId in linksTo) {
169-
JSONAPIResource *linkedResource = [[linked objectForKey:linkType] objectForKey:linkedId];
151+
if (linksTo[@"id"] != nil) {
152+
id linksToId = linksTo[@"id"];
153+
154+
JSONAPIResource *linkedResource = [[linked objectForKey:linkType] objectForKey:linksToId];
170155
if (linkedResource != nil) {
171-
[linkedResources addObject:linkedResource];
156+
[self.__resourceLinks setObject:linkedResource forKey:linkKey];
157+
}
158+
} else if (linksTo[@"ids"] != nil) {
159+
id linksToIds = linksTo[@"ids"];
160+
161+
NSMutableArray *linkedResources = [NSMutableArray array];
162+
[self.__resourceLinks setObject:linkedResources forKey:linkKey];
163+
164+
for (id linkedId in linksToIds) {
165+
JSONAPIResource *linkedResource = [[linked objectForKey:linkType] objectForKey:linkedId];
166+
if (linkedResource != nil) {
167+
[linkedResources addObject:linkedResource];
168+
}
172169
}
173170
}
174171

172+
175173
}
176174
}
177175

0 commit comments

Comments
 (0)