api-core
Version:
Model-based dynamic multi-level APIs for any provider, plus multiple consumption channels
118 lines (97 loc) • 2.92 kB
text/typescript
import {ApiEdgeDefinition} from "../edge/ApiEdgeDefinition";
import {OneToManyRelation} from "../relations/OneToManyRelation";
import {OneToOneRelation} from "../relations/OneToOneRelation";
import {ApiEdgeQueryContext} from "../edge/ApiEdgeQueryContext";
import {ApiEdgeMethod} from "../edge/ApiEdgeMethod";
import {Api} from "../Api";
export class PathSegment {
edge: ApiEdgeDefinition;
relation: OneToManyRelation|null;
inspect = () => {
return '';
}
}
export class MethodPathSegment extends PathSegment {
edge: ApiEdgeDefinition;
method: ApiEdgeMethod;
constructor(edge: ApiEdgeDefinition, method: ApiEdgeMethod) {
super();
this.edge = edge;
this.method = method;
}
inspect = () => {
return `call{${this.method.name}}`;
}
}
export class EdgePathSegment extends PathSegment {
edge: ApiEdgeDefinition;
relation: OneToManyRelation|null;
constructor(edge: ApiEdgeDefinition, relation: OneToManyRelation|null) {
super();
this.edge = edge;
this.relation = relation;
}
inspect = () => {
return `[${this.edge.name}]`;
}
}
export class EntryPathSegment extends PathSegment {
edge: ApiEdgeDefinition;
relation: OneToManyRelation|null;
id: string;
constructor(edge: ApiEdgeDefinition, id: string, relation: OneToManyRelation|null) {
super();
this.edge = edge;
this.relation = relation;
this.id = id;
}
inspect = () => {
return `${this.edge.name}(${this.id})`;
}
}
export class RelatedFieldPathSegment extends PathSegment {
edge: ApiEdgeDefinition;
relation: OneToOneRelation;
constructor(edge: ApiEdgeDefinition, relation: OneToOneRelation) {
super();
this.edge = edge;
this.relation = relation;
}
inspect = () => {
return `${this.edge.name}.${this.relation.name}`;
}
}
export class ApiRequestPath {
segments: PathSegment[] = [];
add = (segment: PathSegment) => {
this.segments.push(segment);
};
inspect = () => {
return this.segments.map(segment => segment.inspect()).join(' -> ');
}
}
export enum ApiRequestType {
Create = 1 << 0,
Read = 1 << 1,
Update = 1 << 2,
Patch = 1 << 3,
Delete = 1 << 4,
Exists = 1 << 5,
Any = Create | Read | Update | Patch | Delete | Exists,
Change = Create | Update | Patch
}
export class ApiRequest {
api: Api;
type: ApiRequestType;
path: ApiRequestPath;
body: any|null = null; //Should be request context
stream: NodeJS.ReadableStream|null = null;
context: ApiEdgeQueryContext; //Should be request context
metadata: any = {};
constructor(api: Api) {
this.api = api;
this.path = new ApiRequestPath();
this.type = ApiRequestType.Read;
this.context = new ApiEdgeQueryContext();
}
}