diff --git a/packages/platform-fastify/adapters/fastify-adapter.ts b/packages/platform-fastify/adapters/fastify-adapter.ts index 800323668c6..2a741048f5e 100644 --- a/packages/platform-fastify/adapters/fastify-adapter.ts +++ b/packages/platform-fastify/adapters/fastify-adapter.ts @@ -53,6 +53,7 @@ import { parse as querystringParse } from 'querystring'; import { FASTIFY_ROUTE_CONFIG_METADATA, FASTIFY_ROUTE_CONSTRAINTS_METADATA, + FASTIFY_ROUTE_LOG_METADATA, } from '../constants'; import { NestFastifyBodyParserOptions } from '../interfaces'; import { @@ -750,8 +751,15 @@ export class FastifyAdapter< handlerRef, ); + const routeLog = Reflect.getMetadata( + FASTIFY_ROUTE_LOG_METADATA, + handlerRef, + ); + + const hasConfig = !isUndefined(routeConfig); const hasConstraints = !isUndefined(routeConstraints); + const hasLog = !isUndefined(routeLog); const routeToInject: RouteOptions & RouteShorthandOptions = { @@ -760,7 +768,7 @@ export class FastifyAdapter< handler: handlerRef, }; - if (isVersioned || hasConstraints || hasConfig) { + if (isVersioned || hasConstraints || hasConfig || hasLog) { const isPathAndRouteTuple = args.length === 2; if (isPathAndRouteTuple) { const constraints = { @@ -777,6 +785,9 @@ export class FastifyAdapter< ...routeConfig, }, }), + ...(hasLog && { + ...routeLog, + }), }; const routeToInjectWithOptions = { ...routeToInject, ...options }; diff --git a/packages/platform-fastify/constants.ts b/packages/platform-fastify/constants.ts index 2f00d8077f5..ae1f90fe54a 100644 --- a/packages/platform-fastify/constants.ts +++ b/packages/platform-fastify/constants.ts @@ -1,3 +1,4 @@ export const FASTIFY_ROUTE_CONFIG_METADATA = '__fastify_route_config__'; export const FASTIFY_ROUTE_CONSTRAINTS_METADATA = '__fastify_route_constraints__'; +export const FASTIFY_ROUTE_LOG_METADATA = '__fastify_route_log__'; diff --git a/packages/platform-fastify/decorators/index.ts b/packages/platform-fastify/decorators/index.ts index 67cc9d3d817..8471835f499 100644 --- a/packages/platform-fastify/decorators/index.ts +++ b/packages/platform-fastify/decorators/index.ts @@ -1,2 +1,4 @@ export * from './route-config.decorator'; export * from './route-constraints.decorator'; +export * from './route-log.decorator'; + diff --git a/packages/platform-fastify/decorators/route-log.decorator.ts b/packages/platform-fastify/decorators/route-log.decorator.ts new file mode 100644 index 00000000000..67884b33147 --- /dev/null +++ b/packages/platform-fastify/decorators/route-log.decorator.ts @@ -0,0 +1,11 @@ +import { SetMetadata } from '@nestjs/common'; +import { FASTIFY_ROUTE_LOG_METADATA } from '../constants'; +import { LogLevel } from 'fastify'; + +/** + * @publicApi + * + * @param config See {@link https://fastify.dev/docs/latest/Reference/Routes/#custom-log-level} + */ +export const RouteLog = (config: { logLevel: LogLevel }) => + SetMetadata(FASTIFY_ROUTE_LOG_METADATA, config); diff --git a/packages/platform-fastify/test/decorators/router-log.decorator.spec.ts b/packages/platform-fastify/test/decorators/router-log.decorator.spec.ts new file mode 100644 index 00000000000..0a3913d5829 --- /dev/null +++ b/packages/platform-fastify/test/decorators/router-log.decorator.spec.ts @@ -0,0 +1,17 @@ +import { expect } from 'chai'; +import { FASTIFY_ROUTE_LOG_METADATA } from '../../constants'; +import { RouteLog } from '../../decorators/route-log.decorator'; + +describe('@RouteConfig', () => { + const routeConfig = { logLevel: 'debug' }; + class Test { + config; + @RouteLog(routeConfig) + public static test() {} + } + + it('should enhance method with expected fastify route config', () => { + const path = Reflect.getMetadata(FASTIFY_ROUTE_LOG_METADATA, Test.test); + expect(path).to.be.eql(routeConfig); + }); +});