redis-smq-rest-api
Version:
REST API for RedisSMQ: OpenAPI 3 schema and Swagger UI for managing queues, messages, and consumers.
70 lines • 3.48 kB
JavaScript
import KoaRouter from '@koa/router';
import { RedisSMQError } from 'redis-smq-common';
import { Container } from '../../container/Container.js';
import { getErrorResponseParams } from '../../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';
const validatorCacheByController = new Map();
function getOrCreateValidatorsForController(schemaGenerator, controllerName, payloadSources) {
const cacheKey = `${controllerName}:${payloadSources.join(',')}`;
let cachedValidators = validatorCacheByController.get(cacheKey);
if (!cachedValidators) {
const requestSchemas = schemaGenerator.getRequestSchemas(controllerName, payloadSources);
const requestValidators = schemaGenerator.getRequestValidators(requestSchemas);
const responseSchemas = schemaGenerator.getResponseSchemas(controllerName);
const responseValidators = schemaGenerator.getResponseValidators(responseSchemas);
cachedValidators = {
requestValidators,
responseValidators,
};
validatorCacheByController.set(cacheKey, cachedValidators);
}
return cachedValidators;
}
async function registerRouteWithValidation(router, controllerHandler, controllerName, httpMethod, payloadSources, routePath, schemaGenerator) {
const { requestValidators, responseValidators } = getOrCreateValidatorsForController(schemaGenerator, controllerName, payloadSources);
router[httpMethod](routePath, ValidateRequestMiddleware(requestValidators), async (ctx, next) => {
try {
const [statusCode, responseData] = await controllerHandler(ctx, next);
const responseBody = responseData ?? null;
ctx.status = statusCode;
ctx.body =
responseBody === null && statusCode === 204
? null
: { data: responseBody };
ctx.state.responseSchemaKey = 'OK';
}
catch (error) {
if (error instanceof RedisSMQError) {
const [errorCode, errorMessage] = getErrorResponseParams(error);
ctx.state.responseSchemaKey = errorMessage;
ctx.status = errorCode;
ctx.body = {
error: {
code: errorCode,
message: errorMessage,
details: {},
},
};
}
else
throw error;
}
return next();
}, ValidateResponseMiddleware(responseValidators));
}
export async function registerResources(routingMap) {
const { apiServer } = Container.getInstance().resolve('config');
const { basePath } = apiServer;
const apiRouter = new KoaRouter({
prefix: basePath && basePath.length > 1 ? basePath : undefined,
});
const schemaGenerator = SchemaGenerator();
await parseRoutingMap(routingMap, async (controllerHandler, controllerName, httpMethod, payloadSources, routePath) => {
await registerRouteWithValidation(apiRouter, controllerHandler, controllerName, httpMethod, payloadSources, routePath, schemaGenerator);
});
return apiRouter;
}
//# sourceMappingURL=index.js.map