@@ -40,12 +40,24 @@ function byPrimaryKey(model) {
4040 * @return {Object }
4141 */
4242function createRelationshipObject ( include , item ) {
43- const relatedItem = { } ;
44- const relatedModelIdAttribute = Object . keys ( include . model . attributes ) . filter ( byPrimaryKey ( include . model ) ) [ 0 ] ;
45- const foreignKeyValue = item [ include . association . options . foreignKey ] ;
46- relatedItem . type = include . model . name ;
47- relatedItem [ relatedModelIdAttribute ] = foreignKeyValue ;
48- return foreignKeyValue !== null ? relatedItem : null ;
43+ const relatedModelIdAttribute = include . association . sourceIdentifier ; //Object.keys(include.model.attributes).filter(byPrimaryKey(include.model))[0];
44+ const associationValue = item [ include . as ] ;
45+ if ( Array . isArray ( associationValue ) ) {
46+ const results = [ ] ;
47+ associationValue . forEach ( function ( record ) {
48+ const relatedItem = { } ;
49+ relatedItem . type = include . model . name ;
50+ relatedItem [ relatedModelIdAttribute ] = record [ relatedModelIdAttribute ] ;
51+ results . push ( relatedItem ) ;
52+ } ) ;
53+ return results ;
54+ } else if ( typeof associationValue === 'object' ) {
55+ const relatedItem = { } ;
56+ relatedItem . type = include . model . name ;
57+ relatedItem [ relatedModelIdAttribute ] = associationValue [ relatedModelIdAttribute ] ;
58+ return relatedItem ;
59+ }
60+ return null ;
4961}
5062
5163/**
@@ -62,10 +74,16 @@ function parseRelationships(data, includedData) {
6274 relationship [ relationshipName ] = { data : createRelationshipObject ( include , data ) } ;
6375 if ( data [ include . as ] !== null ) {
6476 const serializedRelationship = jsonapify ( data [ include . as ] , include . model , include . model . name + '/' + data [ include . as ] . id , { include : [ ] } ) ;
65- includedData . push ( Object . assign ( { } , serializedRelationship . document , { links : serializedRelationship . links } ) ) ;
66- delete data [ include . as ] [ include . association . options . foreignKey ] ;
77+ if ( Array . isArray ( serializedRelationship . document ) ) {
78+ Array . prototype . push . apply ( includedData , [ ...serializedRelationship . document . map ( function ( item ) {
79+ return Object . assign ( item , { links : { self : '/' + include . model . name + '/' + item . id } } ) ;
80+ } ) ] ) ;
81+ } else {
82+ includedData . push ( Object . assign ( { } , serializedRelationship . document , { links : serializedRelationship . links } ) ) ;
83+ }
84+ delete data [ include . as ] [ include . association . foreignKey ] ;
6785 }
68- delete data [ include . association . options . foreignKey ] ;
86+ delete data [ include . association . foreignKey ] ;
6987 delete data [ include . as ] ;
7088 if ( relationship [ relationshipName ] . data !== null ) {
7189 data . relationships = Object . assign ( { } , data . relationships , relationship ) ;
@@ -125,7 +143,7 @@ function jsonapify(data, model, selfUrl, context) {
125143 attributes : attributes
126144 } ) ;
127145
128- if ( json . data . attributes . relationships ) {
146+ if ( json . data . attributes && json . data . attributes . relationships ) {
129147 json . data . relationships = json . data . attributes . relationships ;
130148 delete json . data . attributes . relationships ;
131149 }
0 commit comments