From 49437817a55aa28a815b98b1e8b3e843318c0dbc Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Sat, 13 Jun 2026 19:13:08 +0300 Subject: [PATCH] fix: bind middleware logger context; generate OpenAPI types for frontend - Fix RequestLoggingMiddleware this.logger crash by binding the use() method to the instance - Generate src/api/types.ts from live backend via openapi-typescript --- apps/backend/src/main.ts | 3 +- apps/frontend/src/api/types.ts | 430 +++++++++++++++++++++++++++++++++ 2 files changed, 432 insertions(+), 1 deletion(-) create mode 100644 apps/frontend/src/api/types.ts diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index 6db90b8..6b04342 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -15,7 +15,8 @@ async function bootstrap() { app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true })); app.useGlobalFilters(new HttpExceptionFilter()); app.useGlobalInterceptors(new TransformInterceptor()); - app.use(new RequestLoggingMiddleware().use); + const reqLogMiddleware = new RequestLoggingMiddleware(); + app.use(reqLogMiddleware.use.bind(reqLogMiddleware)); app.enableCors(); diff --git a/apps/frontend/src/api/types.ts b/apps/frontend/src/api/types.ts new file mode 100644 index 0000000..ebaadb4 --- /dev/null +++ b/apps/frontend/src/api/types.ts @@ -0,0 +1,430 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/api/v1/health": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Проверка состояния сервиса */ + get: operations["HealthController_check"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/securities/search": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Поиск по инструментам */ + get: operations["SecuritiesController_search"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/securities/shares/{secid}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Получить спецификацию акции */ + get: operations["SharesController_getShare"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/securities/shares/{secid}/marketdata": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Получить рыночные данные акции */ + get: operations["SharesController_getMarketData"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/securities/shares/{secid}/dividends": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Получить дивиденды */ + get: operations["SharesController_getDividends"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/securities/shares/{secid}/history": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Получить дневную историю торгов акции */ + get: operations["SharesController_getHistory"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/securities/bonds/{secid}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Получить спецификацию облигации */ + get: operations["BondsController_getBond"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/securities/bonds/{secid}/marketdata": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Получить рыночные данные облигации */ + get: operations["BondsController_getMarketData"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/securities/bonds/{secid}/history": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Получить дневную историю торгов облигации */ + get: operations["BondsController_getHistory"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/securities/shares/{secid}/candles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Получить свечи акции */ + get: operations["CandlesController_getShareCandles"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/securities/bonds/{secid}/candles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Получить свечи облигации */ + get: operations["CandlesController_getBondCandles"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + HealthController_check: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + SecuritiesController_search: { + parameters: { + query: { + /** @description Поисковый запрос (тикер, название, ISIN) */ + q: string; + type?: "all" | "share" | "bond"; + limit?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + SharesController_getShare: { + parameters: { + query?: never; + header?: never; + path: { + secid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + SharesController_getMarketData: { + parameters: { + query?: never; + header?: never; + path: { + secid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + SharesController_getDividends: { + parameters: { + query?: never; + header?: never; + path: { + secid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + SharesController_getHistory: { + parameters: { + query: { + from: string; + till: string; + }; + header?: never; + path: { + secid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + BondsController_getBond: { + parameters: { + query?: never; + header?: never; + path: { + secid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + BondsController_getMarketData: { + parameters: { + query?: never; + header?: never; + path: { + secid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + BondsController_getHistory: { + parameters: { + query: { + from: string; + till: string; + }; + header?: never; + path: { + secid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + CandlesController_getShareCandles: { + parameters: { + query: { + interval: "1h" | "24h"; + from: string; + till: string; + }; + header?: never; + path: { + secid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + CandlesController_getBondCandles: { + parameters: { + query: { + interval: "1h" | "24h"; + from: string; + till: string; + }; + header?: never; + path: { + secid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; +}