@@ -52,12 +52,40 @@ export class JsonApiAdapter extends HttpAdapter{
52
52
return ;
53
53
}
54
54
55
- public jsonApiSerialize ( resourceConfig :Mapper , data :any ) {
56
- // console.log('Serialize: ', resourceConfig, res);
55
+ public jsonApiSerialize ( mapper :any , data :any ) {
56
+ let id :any = data [ mapper . idAttribute ] ;
57
+ delete data [ mapper . idAttribute ] ;
57
58
58
- console . log ( 'lol' , data )
59
+ // Just cache a pointer to relations for the Resource
60
+ this . mapperCacheRelationByField ( mapper ) ;
61
+
62
+ let relationships :any = { }
63
+
64
+ for ( let key in data ) {
65
+ let relation :any = mapper . relationByFieldId [ key ] ;
66
+ if ( relation ) {
67
+ relationships [ relation . localField ] = {
68
+ data : {
69
+ type : relation . relation ,
70
+ id : data [ key ]
71
+ }
72
+ }
73
+ delete data [ key ]
74
+ }
75
+ }
59
76
60
- return data ;
77
+ let output :any = {
78
+ data : {
79
+ type : mapper . name ,
80
+ attributes : data
81
+ }
82
+ }
83
+
84
+ // Work for update or create, if an id is given, server should accept it
85
+ if ( id ) output . data . id = id ;
86
+ if ( Object . keys ( relationships ) ) output . data . relationships = relationships ;
87
+
88
+ return output ;
61
89
}
62
90
63
91
public jsonApiDeserialize ( mapper :Mapper , res :any , opts :any ) {
@@ -93,14 +121,7 @@ export class JsonApiAdapter extends HttpAdapter{
93
121
if ( ! resource ) { this . warn ( `Can\'t find resource '${ type } '` ) ; continue ; }
94
122
95
123
// Just cache a pointer to relations for the Resource
96
- if ( ! resource . relationByFields ) {
97
- resource . relationByFields = { } ;
98
- for ( let i = 0 , l = ( resource . relationList || [ ] ) . length ; i < l ; i ++ ) {
99
- let field :string = resource . relationList [ i ] . localField ;
100
- if ( ! field ) { this . warn ( 'localField missing' ) ; continue ; }
101
- resource . relationByFields [ field ] = resource . relationList [ i ] ;
102
- }
103
- }
124
+ this . mapperCacheRelationByField ( resource ) ;
104
125
105
126
for ( let id in itemsIndexed [ type ] ) {
106
127
let item :any = itemsIndexed [ type ] [ id ] ;
@@ -109,7 +130,7 @@ export class JsonApiAdapter extends HttpAdapter{
109
130
if ( ! item . relationships || ! Object . keys ( item . relationships ) ) continue ;
110
131
111
132
for ( let relationField in ( item . relationships || { } ) ) {
112
- let relation :any = resource . relationByFields [ relationField ]
133
+ let relation :any = resource . relationByField [ relationField ]
113
134
if ( ! relation || ! item . relationships [ relationField ] || ! item . relationships [ relationField ] . data ) {
114
135
continue ;
115
136
}
@@ -165,6 +186,27 @@ export class JsonApiAdapter extends HttpAdapter{
165
186
} ;
166
187
}
167
188
189
+ private mapperCacheRelationByField ( mapper :any ) :void {
190
+ if ( ! mapper . relationByField || ! mapper . relationByFieldId ) {
191
+ mapper . relationByField = { } ;
192
+ mapper . relationByFieldId = { } ;
193
+ for ( let i = 0 , l = ( mapper . relationList || [ ] ) . length ; i < l ; i ++ ) {
194
+ let field :string = mapper . relationList [ i ] . localField ;
195
+ let key :string = mapper . relationList [ i ] . localKey ;
196
+
197
+ if ( key ) {
198
+ mapper . relationByFieldId [ key ] = mapper . relationList [ i ] ;
199
+ }
200
+
201
+ if ( field ) {
202
+ mapper . relationByField [ field ] = mapper . relationList [ i ] ;
203
+ } else {
204
+ this . warn ( 'localField missing' ) ; continue ;
205
+ }
206
+ }
207
+ }
208
+ }
209
+
168
210
private handleResponse ( opts ?:any ) { return function ( response :any ) : Promise < any > {
169
211
if ( opts && opts . raw ) {
170
212
response . meta = response . data . meta ;
@@ -185,7 +227,6 @@ export class JsonApiAdapter extends HttpAdapter{
185
227
}
186
228
187
229
public create ( mapper : Mapper , props : any , opts ?: any ) : Promise < any > {
188
- console . log ( 'create' )
189
230
return super . create ( mapper , props , opts ) . then ( this . handleResponse ( opts ) )
190
231
}
191
232
0 commit comments