UNPKG

redis-smq-rest-api

Version:
52 lines 2.51 kB
import KoaRouter from '@koa/router'; import { RedisSMQError } from 'redis-smq-common'; import { Container } from '../../app/container/Container.js'; import { getErrorResponseParams } from '../../app/errors/getErrorResponseParams.js'; import { SchemaGenerator } from '../validator/schema-generator.js'; import { ValidateRequestMiddleware } from './middlewares/ValidateRequestMiddleware.js'; import { ValidateResponseMiddleware } from './middlewares/ValidateResponseMiddleware.js'; import { parseRoutingMap } from './parser.js'; async function registerRoute(appRouter, controller, controllerName, method, payload, routePath, schema) { const requestSchema = schema.getRequestSchemas(controllerName, payload); const requestValidatorMap = schema.getRequestValidators(requestSchema); const responseSchema = schema.getResponseSchemas(controllerName); const responseValidatorMap = schema.getResponseValidators(responseSchema); appRouter[method](routePath, ValidateRequestMiddleware(requestValidatorMap), async (ctx, next) => { try { const [status, payload] = await controller(ctx, next); const data = payload ?? null; ctx.status = status; ctx.body = data === null && status === 204 ? null : { data }; ctx.state.responseSchemaKey = 'OK'; } catch (e) { if (e instanceof RedisSMQError) { const reply = getErrorResponseParams(e); const [code, message] = reply; ctx.state.responseSchemaKey = message; ctx.status = code; ctx.body = { error: { code: code, message: message, details: {}, }, }; } else throw e; } return next(); }, ValidateResponseMiddleware(responseValidatorMap)); } export async function registerResources(routingMap) { const { apiServer } = Container.getInstance().resolve('config'); const { basePath } = apiServer; const appRouter = new KoaRouter({ prefix: basePath.length > 1 ? basePath : undefined }); const schema = SchemaGenerator(); await parseRoutingMap(routingMap, async (controller, controllerName, method, payload, path) => { await registerRoute(appRouter, controller, controllerName, method, payload, path, schema); }); return appRouter; } //# sourceMappingURL=index.js.map