UNPKG

api-core

Version:

Model-based dynamic multi-level APIs for any provider, plus multiple consumption channels

129 lines (114 loc) 4.17 kB
import {ApiEdgeQueryFilter, ApiEdgeQueryFilterType, ExportedApiEdgeQueryFilter} from "./ApiEdgeQueryFilter"; import {OneToOneRelation} from "../relations/OneToOneRelation"; import {Api} from "../Api"; import {ApiEdgeQueryParameter, ExportedApiEdgeQueryParameter} from "./ApiEdgeQueryParameter"; export interface ExportedApiEdgeQueryContext { id: string|null fields: string[] populatedRelations: string[] pagination: { skip: number, limit: number } sortBy: [string, number][] filters: ExportedApiEdgeQueryFilter[] parameters: ExportedApiEdgeQueryParameter[] } export class ApiEdgeQueryContext { id: string|null; fields: string[] = []; populatedRelations: OneToOneRelation[] = []; pagination: { skip: number, limit: number }; sortBy: [string, number][] = []; filters: ApiEdgeQueryFilter[] = []; parameters: ApiEdgeQueryParameter[] = []; identity: any; method: string; clone = () => { let temp = new ApiEdgeQueryContext(); temp.id = this.id; temp.identity = this.identity; this.fields.forEach(f => temp.fields.push(f)); this.populatedRelations.forEach(f => temp.populatedRelations.push(f)); this.filters.forEach(f => temp.filters.push(f.clone())); this.parameters.forEach(f => temp.parameters.push(f.clone())); this.sortBy.forEach(f => temp.sortBy.push([f[0], f[1]])); if(this.pagination) { temp.pagination = { skip: this.pagination.skip, limit: this.pagination.limit } } return temp; }; toJSON = (): ExportedApiEdgeQueryContext => { return { id: this.id, fields: this.fields, populatedRelations: this.populatedRelations.map(relation => relation.name), pagination: this.pagination, sortBy: this.sortBy, filters: this.filters, parameters: this.parameters } }; static fromJSON = async (obj: ExportedApiEdgeQueryContext, api: Api) => { const context = new ApiEdgeQueryContext(); context.id = obj.id; context.fields = obj.fields; context.populatedRelations = []; for(let name of obj.populatedRelations) { context.populatedRelations.push(await api.findRelation(name) as OneToOneRelation) } context.pagination = obj.pagination; context.sortBy = obj.sortBy; context.filters = obj.filters.map( ({ field, type, value }) => new ApiEdgeQueryFilter(field, type, value) ); context.parameters = obj.parameters.map( ({ key, value }) => new ApiEdgeQueryParameter(key, value) ); return context }; constructor(id: string|null = null, fields: string[] = []) { this.id = id; this.fields = fields; } paginate = (skip: number, limit: number) => { this.pagination = { skip, limit }; return this }; sort = (fieldName: string, ascending: boolean = true) => { this.sortBy.push([fieldName, (ascending ? 1 : -1)]); return this }; populate(relation: OneToOneRelation) { this.populatedRelations.push(relation); return this } field(field: string) { this.fields.push(field); return this } filter(field: string, type: ApiEdgeQueryFilterType, value: any) { this.filters.push(new ApiEdgeQueryFilter(field, type, value)); return this } parameter(key: string): any; parameter(key: string, value: any): ApiEdgeQueryContext; parameter(key: string, value?: any): ApiEdgeQueryContext|any { if(typeof value === "undefined") { const param = this.parameters.find(p => p.key === key); return param ? param.value : null } else { this.parameters.push(new ApiEdgeQueryParameter(key, value)); return this } } }