UNPKG

@tsed/schema

Version:
104 lines (103 loc) 3.11 kB
import { concatPath } from "../utils/concatPath.js"; /** * Represents a fully resolved HTTP route combining controller and method metadata. * * JsonOperationRoute provides a unified view of an HTTP endpoint by combining: * - Controller class information (token, basePath) * - Method metadata (endpoint store) * - Operation details (HTTP method, path, parameters) * - Full URL computation * * ### Responsibilities * * - **URL Resolution**: Combines base path and operation path into full URL * - **Metadata Access**: Provides convenient access to operation, parameters, and store * - **Route Identification**: Computes route names and operation IDs * - **Parameter Type Tracking**: Maintains map of parameter types (query, body, etc.) * * ### Usage * * ```typescript * // Routes are typically created during framework initialization * const route = new JsonOperationRoute({ * token: MyController, * endpoint: methodStore, * operationPath: { method: "GET", path: "/:id" }, * basePath: "/users" * }); * * // Access route information * console.log(route.fullPath); // "/users/:id" * console.log(route.method); // "GET" * console.log(route.name); // "MyController.getUser()" * console.log(route.operationId); // "getUser" * ``` * * ### URL Construction * * The route combines controller base path with operation path: * - Base path: `/users` (from `@Controller("/users")`) * - Operation path: `/:id` (from `@Get("/:id")`) * - Full path: `/users/:id` * * ### Parameter Type Detection * * The route maintains a map of parameter types present in the operation: * ```typescript * route.has("query") // true if operation has @QueryParams * route.has("body") // true if operation has @BodyParams * route.has("path") // true if operation has @PathParams * ``` * * @typeParam Entity - The type of JsonMethodStore (default: JsonMethodStore) * * @public */ export class JsonOperationRoute { constructor(options) { Object.assign(this, options); this.paramsTypes = this.endpoint.getParamTypes(); } get url() { return this.fullPath; } get path() { return this.operationPath?.path; } get fullPath() { return concatPath(this.basePath, this.path); } get method() { return this.operationPath?.method || "USE"; } get name() { return `${this.endpoint.targetName}.${this.methodClassName}()`; } get className() { return this.endpoint.targetName; } get methodClassName() { return this.propertyKey; } get parameters() { return this.endpoint.parameters; } get propertyKey() { return String(this.endpoint.propertyKey); } get propertyName() { return this.endpoint.propertyName; } get store() { return this.endpoint.store; } get operation() { return this.endpoint.operation; } get operationId() { return this.operation.get("operationId") || this.endpoint.propertyKey; } has(key) { return this.paramsTypes[key]; } }