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 ArrayFormatters from "kinibind/ts/formatters/array-formatters"; import EntityApi from "../api/entity-api"; export default class EntityAggregateArrayProxy extends ArrayProxy { // Entity API private _entityAPI: EntityApi = new EntityApi(); // Entity names private _entityNames: string[]; // Construct with list of entity names constructor(entityNames: string[]) { super(); this._entityNames = entityNames; } // Implement the filter results to return the aggregate of all data // for all passed entities async filterResults(filterQuery: FilterQuery): Promise { let combinedResults: any = []; for (var i = 0; i < this._entityNames.length; i++) { let entityResults = await this._entityAPI.all(this._entityNames[i]); combinedResults = combinedResults.concat(entityResults); } if (filterQuery.filters) { combinedResults = ArrayFormatters.filter(combinedResults, filterQuery.filters); } if (filterQuery.sortOrders) { combinedResults = ArrayFormatters.sort(combinedResults, filterQuery.sortOrders) } if (filterQuery.offset || filterQuery.limit) { combinedResults = ArrayFormatters.slice(combinedResults, filterQuery.offset ? filterQuery.offset : 0, filterQuery.limit ? filterQuery.limit : 1000000000); } return new FilteredResults(combinedResults, combinedResults.length); } }