From 542a8b02d50873069ff6a0856cfce4fac1faefd1 Mon Sep 17 00:00:00 2001 From: Abrar Arshad Date: Wed, 11 Oct 2017 00:12:13 +0300 Subject: [PATCH] Support for multiple types per HasMany field --- package-lock.json | 6 +++--- src/models/json-api.model.ts | 30 +++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index e966e267..3008828c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -129,7 +129,7 @@ }, "@types/qs": { "version": "https://registry.npmjs.org/@types/qs/-/qs-6.5.0.tgz", - "integrity": "sha1-FFFOjuJKTQZywMDaXgGk8R2mDXE=" + "integrity": "sha512-KCvdV85GNkZAyWOYxUUR+3XNairGv60Niu42GvVy9JlXRPEIZHXQuk0xMi/mla/25pLZzdY7uzLhBK/B81KZBg==" }, "@types/reflect-metadata": { "version": "https://registry.npmjs.org/@types/reflect-metadata/-/reflect-metadata-0.0.5.tgz", @@ -2233,7 +2233,7 @@ }, "karma-chrome-launcher": { "version": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", "dev": true, "requires": { "fs-access": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", @@ -4210,7 +4210,7 @@ "dependencies": { "async": { "version": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", "dev": true, "requires": { "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" diff --git a/src/models/json-api.model.ts b/src/models/json-api.model.ts index c4c83d86..8b88936b 100644 --- a/src/models/json-api.model.ts +++ b/src/models/json-api.model.ts @@ -1,5 +1,6 @@ import { Headers } from '@angular/http'; import find from 'lodash-es/find'; +import includes from 'lodash-es/includes'; import { Observable } from 'rxjs/Observable'; import { JsonApiDatastore, ModelType } from '../services/json-api-datastore.service'; import { ModelConfig } from '../interfaces/model-config.interface'; @@ -65,22 +66,33 @@ export class JsonApiModel { return Reflect.getMetadata('JsonApiModelConfig', this.constructor); } + private parseHasMany(data: any, included: any, level: number): void { let hasMany: any = Reflect.getMetadata('HasMany', this); if (hasMany) { for (let metadata of hasMany) { let relationship: any = data.relationships ? data.relationships[metadata.relationship] : null; if (relationship && relationship.data && relationship.data.length > 0) { - let typeName: string = relationship.data[0].type; - let modelType: ModelType = Reflect.getMetadata('JsonApiDatastoreConfig', this._datastore.constructor).models[typeName]; - if (modelType) { - let relationshipModel: JsonApiModel[] = this.getHasManyRelationship(modelType, relationship.data, included, typeName, level); - if (relationshipModel.length > 0) { - this[metadata.propertyName] = relationshipModel; + let allModels: JsonApiModel[] = []; + let modelTypesFetched: any = []; + for (let typeIndex of Object.keys(relationship.data)) { + let typeName: string = relationship.data[typeIndex].type; + if (!includes(modelTypesFetched, typeName)) { + modelTypesFetched.push(typeName); + let modelType: ModelType = Reflect.getMetadata('JsonApiDatastoreConfig', this._datastore.constructor).models[typeName]; + if (modelType) { + let relationshipModels: JsonApiModel[] = this.getHasManyRelationship(modelType, relationship.data, included, typeName, level); + if (relationshipModels.length > 0) { + allModels = allModels.concat(relationshipModels); + } + } else { + throw { message: 'parseHasMany - Model type for relationship ' + typeName + ' not found.' }; + } + } + if (allModels.length > 0) { + this[metadata.propertyName] = allModels; + } } - } else { - throw {message: 'parseHasMany - Model type for relationship ' + typeName + ' not found.'}; - } } } }