import { IModelType, IModelTypeComposite, IClientProps, IStatusMessage } from '@hn3000/metamodel'; export type ParamLocation = 'path' | 'query' | 'header' | 'formData' | 'body'; export interface IAPIRequestModel { paramsType: IModelTypeComposite | IModelType; format: "formData" | "body" | "empty"; paramsByLocation: { [location in ParamLocation]: string[]; }; locationsByParam: { [param: string]: ParamLocation; }; } export interface IAPIResponseModel { [status: string]: IModelTypeComposite | IModelType; //'200': IModelTypeComposite | IModelType; } export type TokenLocation = 'query' | 'header'; export interface IAPITokenModel { location: TokenLocation; name: string; } export interface IAPIOperation extends IClientProps { readonly name: string; readonly id: string; readonly pathPattern: string; readonly method: string; readonly requestModel: IAPIRequestModel; readonly responseModel: IAPIResponseModel; path: (req: any) => string; // replaces path parameters query: (req: any) => string; // returns query parameters headers(req: any): { [key: string]: string }; body(req: any): undefined | string; } export type IAPIOperationInit = & Pick, 'id'|'pathPattern'|'method'|'requestModel'|'responseModel'> & Partial> ; export interface IAPIModel extends IClientProps { operations(): ReadonlyArray>; operationById(id:string): IAPIOperation; readonly base: string; readonly id: string; subModel(ids: string[]): IAPIModel; } export interface IAPIModelBuilder extends IAPIModel { add(op: IAPIOperation): IAPIModelBuilder; remove(it: string|IAPIOperation): IAPIModelBuilder; setBase(base: string): void; subModel(ids: string[]): IAPIModelBuilder; freeze(): IAPIModel; // create a frozen copy that can no longer be changed } export interface IAPIModelRegistry { fetchModel(url: string, id: string): Promise; model(id: string): IAPIModel; } export interface IAPIRequestContext { operation: IAPIOperation; requestData: TReq; } export interface IAPIResult { isSuccess(): boolean; success(): TResponse | undefined; error(): Error | undefined; response(): any; // Success in this case requestContext(): IAPIRequestContext; } export enum ErrorKind { InvalidOperation, Failure, Success } export interface IAPIError { kind: ErrorKind; httpStatus: number; error: any; } export interface IHttpHeaders { [name:string]: string; } export interface IAPIClient { runOperationById(id: string, requestData: any): Promise>; // will reject to an IAPIError in case of errors runOperation(operation: IAPIOperation, requestData: TRequest): Promise>; // will reject to an IAPIError in case of errors urlForOperationId(id: string, requestData: any): string | undefined; urlForOperation(operation: IAPIOperation, requestData: TRequest): string; requestInfoForOperationId(id: string, requestData: any): [string, RequestInit] | undefined; requestInfoForOperation(operation: IAPIOperation, requestData: TRequest): [string, RequestInit]; model: IAPIModel; baseUrl: string; readonly defaultValues: any; readonly defaultHeaders: IHttpHeaders; addDefaultValues(values: any): IStatusMessage[]; setDefaultValues(values: any): IStatusMessage[]; addDefaultHeaders(headers: IHttpHeaders): IStatusMessage[]; setDefaultHeaders(headers: IHttpHeaders): IStatusMessage[]; }