You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.5 KiB
40 lines
1.5 KiB
import Controller from "./Controller.ts";
|
|
import {Request} from "./Request.ts";
|
|
import ResponseFactory from "./response/ResponseFactory.ts";
|
|
import * as api from '../support/api.ts'
|
|
import JSONResponseFactory from "./response/JSONResponseFactory.ts";
|
|
|
|
export default class ApiController extends Controller {
|
|
public get_bound_method(method_name: string): (...args: any[]) => any {
|
|
// @ts-ignore
|
|
if ( typeof this[method_name] !== 'function' ) {
|
|
throw new TypeError(`Attempt to get bound method for non-function type: ${method_name}`)
|
|
}
|
|
|
|
return async (...args: any[]): Promise<any> => {
|
|
if ( args.length !== 1 ) {
|
|
// @ts-ignore
|
|
return this[method_name](...args)
|
|
}
|
|
|
|
const request: Request = args[0]
|
|
// @ts-ignore
|
|
const result = await this[method_name](request)
|
|
|
|
// If we have a request or a response factory, return that
|
|
if ( result instanceof Request || result instanceof ResponseFactory ) {
|
|
return result
|
|
}
|
|
|
|
// Otherwise, try to package the results as an API response
|
|
if ( Array.isArray(result) ) {
|
|
return this.make(JSONResponseFactory, api.many(result))
|
|
} else if ( typeof result === 'string' ) {
|
|
return this.make(JSONResponseFactory, api.message(result))
|
|
} else {
|
|
return this.make(JSONResponseFactory, api.one(result))
|
|
}
|
|
}
|
|
}
|
|
}
|