import ArrayProxy from "kinibind/ts/proxy/array-proxy"; import FilterQuery from "kinibind/ts/proxy/filter-query"; import FilteredResults from "kinibind/ts/proxy/filtered-results"; import Loader from "../util/loader"; import Config from "../config"; // Data proxy - lazy loading implementation export default class EntityDataProxy extends ArrayProxy { // Name of the entity this wraps private _entityName: any; // All results private _dataByKey: any; constructor(entityName: string) { super(); this._entityName = entityName; } /** * Filter results for data proxy * * @param filterQuery */ filterResults(filterQuery: FilterQuery): Promise { return this.ensureData().then(dataByKey => { let values: any = []; Object.keys(this._dataByKey).forEach(key => { values.push(this._dataByKey[key]); }) return new FilteredResults(values, values.length); }); } // Ensure data is loaded private ensureData(): Promise { if (!this._dataByKey) { return Loader.loadSiteJsonFile(Config.instance().siteDataBasePath + "/data/" + this._entityName + ".json").then(dataByKey => { this._dataByKey = dataByKey; return this._dataByKey; }); } else { return Promise.resolve(this._dataByKey); } } }