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' /** * HTTP controller which wraps its handlers output in JSON response factories, if appropriate. * @extends Controller */ 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 => { 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)) } } } }