diff --git a/src/models/json-api.model.ts b/src/models/json-api.model.ts index 5cea279d..38b2da8d 100644 --- a/src/models/json-api.model.ts +++ b/src/models/json-api.model.ts @@ -23,7 +23,7 @@ export class JsonApiModel { } } - save(params?: any, headers?: Headers): Observable { + save(params?: any, headers?: Headers): Observable { let attributesMetadata: any = Reflect.getMetadata('Attribute', this); return this._datastore.saveRecord(attributesMetadata, this, params, headers); } @@ -69,7 +69,7 @@ export class JsonApiModel { 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]; + let modelType: ModelType = Reflect.getMetadata('JsonApiDatastoreConfig', this._datastore.constructor).models[typeName]; let relationshipModel: JsonApiModel[] = this.getHasManyRelationship(modelType, relationship.data, included, typeName, level); if (relationshipModel.length > 0) { this[metadata.propertyName] = relationshipModel; @@ -88,7 +88,7 @@ export class JsonApiModel { let dataRelationship: any = (relationship.data instanceof Array) ? relationship.data[0] : relationship.data; if (dataRelationship) { let typeName: string = dataRelationship.type; - let modelType: ModelType = Reflect.getMetadata('JsonApiDatastoreConfig', this._datastore.constructor).models[typeName]; + let modelType: ModelType = Reflect.getMetadata('JsonApiDatastoreConfig', this._datastore.constructor).models[typeName]; let relationshipModel: JsonApiModel = this.getBelongsToRelationship(modelType, dataRelationship, included, typeName, level); if (relationshipModel) { this[metadata.propertyName] = relationshipModel; @@ -99,12 +99,12 @@ export class JsonApiModel { } } - private getHasManyRelationship(modelType: ModelType, data: any, included: any, typeName: string, level: number): JsonApiModel[] { - let relationshipList: JsonApiModel[] = []; + private getHasManyRelationship(modelType: ModelType, data: any, included: any, typeName: string, level: number): T[] { + let relationshipList: T[] = []; data.forEach((item: any) => { let relationshipData: any = _.find(included, {id: item.id, type: typeName}); if (relationshipData) { - let newObject: JsonApiModel = this.createOrPeek(modelType, relationshipData); + let newObject: T = this.createOrPeek(modelType, relationshipData); if (level <= 1) { newObject.syncRelationships(relationshipData, included, level + 1); } @@ -115,11 +115,11 @@ export class JsonApiModel { } - private getBelongsToRelationship(modelType: ModelType, data: any, included: any, typeName: string, level: number): JsonApiModel { + private getBelongsToRelationship(modelType: ModelType, data: any, included: any, typeName: string, level: number): T { let id: string = data.id; let relationshipData: any = _.find(included, {id: id, type: typeName}); if (relationshipData) { - let newObject: JsonApiModel = this.createOrPeek(modelType, relationshipData); + let newObject: T = this.createOrPeek(modelType, relationshipData); if (level <= 1) { newObject.syncRelationships(relationshipData, included, level + 1); } @@ -128,12 +128,12 @@ export class JsonApiModel { return this._datastore.peekRecord(modelType, id); } - private createOrPeek(modelType: ModelType, data: any): JsonApiModel { + private createOrPeek(modelType: ModelType, data: any): T { let peek = this._datastore.peekRecord(modelType, data.id); if (peek) { return peek; } - let newObject: JsonApiModel = new modelType(this._datastore, data); + let newObject: T = new modelType(this._datastore, data); this._datastore.addToStore(newObject); return newObject; } diff --git a/src/services/json-api-datastore.service.ts b/src/services/json-api-datastore.service.ts index fb7ed194..7ea59c11 100644 --- a/src/services/json-api-datastore.service.ts +++ b/src/services/json-api-datastore.service.ts @@ -8,7 +8,7 @@ import 'rxjs/add/operator/catch'; import 'rxjs/add/observable/throw'; import { JsonApiModel } from '../models/json-api.model'; -export type ModelType = { new(datastore: JsonApiDatastore, data: any): JsonApiModel; }; +export type ModelType = { new(datastore: JsonApiDatastore, data: any): T; }; @Injectable() export class JsonApiDatastore { @@ -19,7 +19,7 @@ export class JsonApiDatastore { constructor(private http: Http) { } - query(modelType: ModelType, params?: any, headers?: Headers): Observable { + query(modelType: ModelType, params?: any, headers?: Headers): Observable { let options: RequestOptions = this.getOptions(headers); let url: string = this.buildUrl(modelType, params); return this.http.get(url, options) @@ -27,7 +27,7 @@ export class JsonApiDatastore { .catch((res: any) => this.handleError(res)); } - findRecord(modelType: ModelType, id: string, params?: any, headers?: Headers): Observable { + findRecord(modelType: ModelType, id: string, params?: any, headers?: Headers): Observable { let options: RequestOptions = this.getOptions(headers); let url: string = this.buildUrl(modelType, params, id); return this.http.get(url, options) @@ -35,12 +35,12 @@ export class JsonApiDatastore { .catch((res: any) => this.handleError(res)); } - createRecord(modelType: ModelType, data?: any): JsonApiModel { + createRecord(modelType: ModelType, data?: any): T { return new modelType(this, {attributes: data}); } - saveRecord(attributesMetadata: any, model?: any, params?: any, headers?: Headers): Observable { - let modelType = model.constructor; + saveRecord(attributesMetadata: any, model?: T, params?: any, headers?: Headers): Observable { + let modelType = >model.constructor; let typeName: string = Reflect.getMetadata('JsonApiModelConfig', modelType).type; let options: RequestOptions = this.getOptions(headers); let relationships: any = !model.id ? this.getRelationships(model) : undefined; @@ -75,12 +75,12 @@ export class JsonApiDatastore { .catch((res: any) => this.handleError(res)); } - peekRecord(modelType: ModelType, id: string): JsonApiModel { + peekRecord(modelType: ModelType, id: string): T { let type: string = Reflect.getMetadata('JsonApiModelConfig', modelType).type; return this._store[type] ? this._store[type][id] : null; } - peekAll(modelType: ModelType): JsonApiModel[] { + peekAll(modelType: ModelType): T[] { let type = Reflect.getMetadata('JsonApiModelConfig', modelType).type; return _.values(this._store[type]); } @@ -89,7 +89,7 @@ export class JsonApiDatastore { this._headers = headers; } - private buildUrl(modelType: ModelType, params?: any, id?: string): string { + private buildUrl(modelType: ModelType, params?: any, id?: string): string { let typeName: string = Reflect.getMetadata('JsonApiModelConfig', modelType).type; let baseUrl: string = Reflect.getMetadata('JsonApiDatastoreConfig', this.constructor).baseUrl; let idToken: string = id ? `/${id}` : null; @@ -115,11 +115,11 @@ export class JsonApiDatastore { return relationships; } - private extractQueryData(res: any, modelType: ModelType): JsonApiModel[] { + private extractQueryData(res: any, modelType: ModelType): T[] { let body: any = res.json(); - let models: JsonApiModel[] = []; + let models: T[] = []; body.data.forEach((data: any) => { - let model: JsonApiModel = new modelType(this, data); + let model: T = new modelType(this, data); this.addToStore(model); if (body.included) { model.syncRelationships(data, body.included, 0); @@ -130,7 +130,7 @@ export class JsonApiDatastore { return models; } - private extractRecordData(res: any, modelType: ModelType, model?: JsonApiModel): JsonApiModel { + private extractRecordData(res: any, modelType: ModelType, model?: T): T { let body: any = res.json(); if (model) { model.id = body.data.id; @@ -208,7 +208,7 @@ export class JsonApiDatastore { return _.keyBy(modelsArray, 'id'); } - private resetMetadataAttributes(res: any, attributesMetadata: any, modelType: ModelType) { + private resetMetadataAttributes(res: any, attributesMetadata: any, modelType: ModelType) { attributesMetadata = Reflect.getMetadata('Attribute', res); for (let propertyName in attributesMetadata) { if (attributesMetadata.hasOwnProperty(propertyName)) {