redis-smq-rest-api
Version:
A RESTful API for RedisSMQ
52 lines • 2.51 kB
JavaScript
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