From de4f71b75fc1a79dd43c460a0bff76f3f38957e3 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 23 May 2025 19:19:46 +0200 Subject: [PATCH 1/2] feat(event-handler): add base router class --- packages/event-handler/src/rest/BaseRouter.ts | 70 +++++++++++++++++++ packages/event-handler/src/rest/Router.ts | 1 + packages/event-handler/src/types/rest.ts | 24 +++++++ 3 files changed, 95 insertions(+) create mode 100644 packages/event-handler/src/rest/BaseRouter.ts create mode 100644 packages/event-handler/src/rest/Router.ts create mode 100644 packages/event-handler/src/types/rest.ts diff --git a/packages/event-handler/src/rest/BaseRouter.ts b/packages/event-handler/src/rest/BaseRouter.ts new file mode 100644 index 000000000..96dce121a --- /dev/null +++ b/packages/event-handler/src/rest/BaseRouter.ts @@ -0,0 +1,70 @@ +import { isRecord } from '@aws-lambda-powertools/commons/typeutils'; +import { + getStringFromEnv, + isDevMode, +} from '@aws-lambda-powertools/commons/utils/env'; +import type { GenericLogger } from '../types/appsync-events.js'; +import type { + RouteHandler, + RouteOptions, + RouterOptions, +} from '../types/rest.js'; + +abstract class BaseRouter { + protected context: Record; // TODO: should this be a map instead? + /** + * A logger instance to be used for logging debug, warning, and error messages. + * + * When no logger is provided, we'll only log warnings and errors using the global `console` object. + */ + protected readonly logger: Pick; + /** + * Whether the router is running in development mode. + */ + protected readonly isDev: boolean = false; + + public constructor(options?: RouterOptions) { + this.context = {}; + const alcLogLevel = getStringFromEnv({ + key: 'AWS_LAMBDA_LOG_LEVEL', + defaultValue: '', + }); + this.logger = options?.logger ?? { + debug: alcLogLevel === 'DEBUG' ? console.debug : () => undefined, + error: console.error, + warn: console.warn, + }; + this.isDev = isDevMode(); + } + + public abstract route(handler: RouteHandler, options: RouteOptions): void; + + public get(path: string, handler: RouteHandler, options?: RouteOptions): void; + public get(path: string, options?: RouteOptions): MethodDecorator; + public get( + path: string, + handler?: RouteHandler | RouteOptions, + options?: RouteOptions + ): MethodDecorator | undefined { + if (handler && typeof handler === 'function') { + this.route(handler, { + ...(options || {}), + method: 'GET', + path, + }); + return; + } + + return (_target, _propertyKey, descriptor: PropertyDescriptor) => { + const routeOptions = isRecord(handler) ? handler : options; + this.route(descriptor.value, { + ...(routeOptions || {}), + method: 'GET', + path, + }); + return descriptor; + }; + } +} + +export { BaseRouter }; diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts new file mode 100644 index 000000000..2a504bee3 --- /dev/null +++ b/packages/event-handler/src/rest/Router.ts @@ -0,0 +1 @@ +abstract class BaseRouter {} diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts new file mode 100644 index 000000000..380e48a89 --- /dev/null +++ b/packages/event-handler/src/types/rest.ts @@ -0,0 +1,24 @@ +import type { BaseRouter } from '../rest/BaseRouter.js'; +import type { GenericLogger } from './appsync-events.js'; + +/** + * Options for the {@link BaseRouter} class + */ +type RouterOptions = { + /** + * A logger instance to be used for logging debug, warning, and error messages. + * + * When no logger is provided, we'll only log warnings and errors using the global `console` object. + */ + logger?: GenericLogger; +}; + +// biome-ignore lint/suspicious/noExplicitAny: we want to keep arguments and return types as any to accept any type of function +type RouteHandler = (...args: T[]) => R; + +type RouteOptions = { + method?: string; + path?: string; +}; + +export type { RouterOptions, RouteHandler, RouteOptions }; From c1e101a57e69abdf72d869d3321ffedcecda214d Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 23 May 2025 19:23:10 +0200 Subject: [PATCH 2/2] chore: remove file --- packages/event-handler/src/rest/Router.ts | 1 - 1 file changed, 1 deletion(-) delete mode 100644 packages/event-handler/src/rest/Router.ts diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts deleted file mode 100644 index 2a504bee3..000000000 --- a/packages/event-handler/src/rest/Router.ts +++ /dev/null @@ -1 +0,0 @@ -abstract class BaseRouter {}