import { EndpointManager } from "./endpoint-manager" import { RequestMethods } from "./interfaces/request-method.inteface"; import { Handler, Middleware } from "./types/handler.type" export abstract class AbstractServer { protected requestMethods: RequestMethods = {}; get(path: string, handler: Handler): T | Promise; get(path: string, ...middlewares: Middleware[]) get(path: string, ...handlers: Array) { this.requestHandler(this.get.name, path, handlers) } post(path: string, handler: Handler): T | Promise; post(path: string, ...middlewares: Middleware[]) post(path: string, ...handlers: Array) { this.requestHandler(this.post.name, path, handlers) } put(path: string, handler: Handler): T | Promise; put(path: string, ...middlewares: Middleware[]) put(path: string, ...handlers: Array) { this.requestHandler(this.put.name, path, handlers) } head(path: string, handler: Handler): T | Promise; head(path: string, ...middlewares: Middleware[]) head(path: string, ...handlers: Array) { this.requestHandler(this.head.name, path, handlers) } delete(path: string, handler: Handler): T | Promise; delete(path: string, ...middlewares: Middleware[]) delete(path: string, ...handlers: Array) { this.requestHandler(this.delete.name, path, handlers) } patch(path: string, handler: Handler): T | Promise; patch(path: string, ...middlewares: Middleware[]) patch(path: string, ...handlers: Array) { this.requestHandler(this.patch.name, path, handlers) } options(path: string, handler: Handler): T | Promise; options(path: string, ...middlewares: Middleware[]) options(path: string, ...handlers: Array) { this.requestHandler(this.options.name, path, handlers) } all(path: string, handler: Handler): T | Promise; all(path: string, ...middlewares: Middleware[]) all(path: string, ...handlers: Array) { this.requestHandler(this.all.name, path, handlers) } private requestHandler(verb: string, path: string, handlers: Array) { const handler = handlers.pop() as Handler; this.addMethod(verb, path, handler, handlers); } private addMethod(method: string, path: string, handler: Handler, middlewares: Middleware[]) { const methodUpper = method.toUpperCase(); let endpointManager: EndpointManager = this.requestMethods[methodUpper]; if (!endpointManager) { this.requestMethods[methodUpper] = new EndpointManager(); endpointManager = this.requestMethods[methodUpper]; } this.addEndpoint(methodUpper, path, handler, middlewares); return endpointManager; } protected abstract addEndpoint(method: string, path: string, handler: Handler, middlewares: Middleware[]); }