/* eslint-disable @typescript-eslint/naming-convention */ import type { ResponseSchema } from '@rocket.chat/http-router'; import { Router } from '@rocket.chat/http-router'; import type { Context as HonoContext } from 'hono'; import type { TypedOptions } from './definition'; declare module 'hono' { interface ContextVariableMap { 'route': string; 'bodyParams-override'?: Record; } } export type APIActionContext = { requestIp: string; urlParams: Record; queryParams: Record; bodyParams: Record; request: Request; path: string; response: any; route: string; }; export type APIActionHandler = (this: APIActionContext, request: Request) => Promise>; export class RocketChatAPIRouter< TBasePath extends string, TOperations extends { [x: string]: unknown; } = NonNullable, > extends Router { protected override convertActionToHandler(action: APIActionHandler): (c: HonoContext) => Promise> { return async (c: HonoContext): Promise> => { const { req, res } = c; const queryParams = this.parseQueryParams(req); const bodyParams = await this.parseBodyParams<{ bodyParamsOverride: Record }>({ request: req, extra: { bodyParamsOverride: c.var['bodyParams-override'] || {} }, }); const request = req.raw.clone(); const context = { requestIp: c.get('remoteAddress'), urlParams: req.param(), queryParams, bodyParams, request, path: req.path, response: res, route: req.routePath, } as APIActionContext; return action.apply(context, [request]); }; } } export type ExtractRouterEndpoints> = TRoute extends RocketChatAPIRouter ? TOperations : never;