@@ -59,32 +59,37 @@ export class BaseService<T> {
5959
6060 let resp = await this . client . makeGetRequest ( endpoint , requestParam ) ;
6161
62- const dataIsArray = Array . isArray ( resp . data ) ;
62+ // hydrate the model(s) in resp.data
63+ // hydrate model relationships from the data in resp.includes
64+ resp . data = Array . isArray ( resp . data )
65+ ? this . hydrateDataArray ( resp . data , resp . included )
66+ : this . hydrateSingleItem ( resp . data , resp . included ) ;
6367
64- // Hydrate response based on whether it's a single item or an array
65- if ( dataIsArray ) {
66- resp . data = resp . data . map ( ( item : any ) => this . hydrateFunction ( item , null ) ) ;
67- } else {
68- resp . data = this . hydrateFunction ( resp . data , null ) ;
69- }
68+ return resp ;
69+ }
7070
71- // Hydrate relationships
72- if ( dataIsArray ) {
73- resp . data = resp . data . map ( ( single : any ) => this . hydrateRelationships ( single , resp . included ) ) ;
74- } else {
75- resp . data = this . hydrateRelationships ( resp . data , resp . included ) ;
76- }
71+ private hydrateModel ( item : JsonData ) : JsonData & T {
72+ return this . hydrateFunction ( item , null ) as JsonData & T ;
73+ }
7774
78- return resp ;
75+ private hydrateDataArray ( items : JsonData [ ] , included : any [ ] ) : ( JsonData & T ) [ ] {
76+ return items
77+ . map ( item => this . hydrateModel ( item ) )
78+ . map ( item => this . hydrateRelationships ( item , included ) as JsonData & T ) ;
79+ }
80+
81+ private hydrateSingleItem ( item : JsonData , included : any [ ] ) : JsonData & T {
82+ const hydrated = this . hydrateModel ( item ) ;
83+ return this . hydrateRelationships ( hydrated , included ) as JsonData & T ;
7984 }
8085
8186 hydrateRelationships ( single : JsonData , included : any [ ] ) : JsonData {
82- if ( ! single . relationships ) return single ;
87+ if ( ! single . relationships || ! included ) return single ;
8388
8489 Object . entries ( single . relationships ) . forEach ( ( [ key , relationship ] ) => {
8590 const { data } = relationship ;
8691
87- // relationship[key] could be array or single object
92+ // Hydrate arrays or single items from included data
8893 relationship . data = Array . isArray ( data )
8994 ? data . map ( relation => this . findMatchingIncluded ( relation , included ) || relation )
9095 : this . findMatchingIncluded ( data , included ) || data ;
0 commit comments