moleculer-mongobubble
Version:
A Moleculer module for generating CRUD APIs using MongoBubble.
105 lines • 8.45 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseIdFromParams = exports.unmergeAndValidate = exports.validateParams = exports.unmergeParams = void 0;
const ajv_1 = __importDefault(require("ajv"));
const bson_1 = require("bson");
const moleculer_1 = require("moleculer");
const ejson_1 = require("./ejson");
function unmergeParams(ctx, { paramsProps = [], queryProps = [], bodyProps = [], mergeAdditionalProps = false, } = {}) {
// This was necessary because moleculer-web has an issue that
// `mergeParams` cannot be defined per action when using auto-aliases
// https://github.com/moleculerjs/moleculer-web/issues/333
// Then, I were also forced to develop a new validation method
// that would work with the unmerged params and also coerce types
// TODO: remove this when the issue is fixed?
// TODO: make another community module with those workarounds?
if (ctx.params.params || ctx.params.query || ctx.params.body) {
// already unmerged
return ctx.params;
}
const params = {};
if (!queryProps?.length && !bodyProps?.length && !mergeAdditionalProps) {
params.body = ctx.params;
return params;
}
if (queryProps.length) {
params.query = {};
queryProps.forEach((prop) => {
params.query[prop] = ctx.params[prop];
});
}
if (bodyProps.length) {
params.body = {};
bodyProps.forEach((prop) => {
params.body[prop] = ctx.params[prop];
});
}
if (mergeAdditionalProps) {
if (!params.body) {
params.body = {};
}
const additionalProps = Object
.keys(ctx.params)
.filter(prop => !queryProps.includes(prop)
&& !bodyProps.includes(prop)
&& !paramsProps.includes(prop));
additionalProps.forEach((prop) => {
params.body[prop] = ctx.params[prop];
});
}
return params;
}
exports.unmergeParams = unmergeParams;
function validateParams(params, schema) {
const ajv = new ajv_1.default({
coerceTypes: true,
useDefaults: true,
});
const validate = ajv.compile(schema);
const valid = validate(params);
if (!valid) {
throw new moleculer_1.Errors.ValidationError(`Invalid params: ${ajv.errorsText(validate.errors)}`);
}
}
exports.validateParams = validateParams;
function unmergeAndValidate(ctx, schema, excludeParams = []) {
const params = unmergeParams(ctx, {
queryProps: schema.properties.query
? Object.keys(schema.properties.query?.properties || {})
: [],
paramsProps: excludeParams,
bodyProps: schema.properties.body
? Object.keys(schema.properties.body?.properties || {})
: [],
mergeAdditionalProps: schema.properties.body
? schema.properties.body.additionalProperties
: false,
});
validateParams(params, schema);
return params;
}
exports.unmergeAndValidate = unmergeAndValidate;
function parseIdFromParams(ctx) {
let id = ctx.params.id || ctx.params?.params?.id;
if (!id) {
throw new moleculer_1.Errors.ValidationError('Missing id in params');
}
if (typeof id === 'object' && (0, ejson_1.isEJSON)(id)) {
id = bson_1.EJSON.deserialize(id);
}
else if (typeof id === 'object' && id._id) {
id = id._id;
}
else {
id = decodeURIComponent(id);
}
if (ctx.service?.entityClass?.parseId) {
id = ctx.service?.entityClass?.parseId(id);
}
return id;
}
exports.parseIdFromParams = parseIdFromParams;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhcmFtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4Q0FBc0I7QUFDdEIsK0JBQXVDO0FBQ3ZDLHlDQUE0QztBQUM1QyxtQ0FBa0M7QUFHbEMsU0FBZ0IsYUFBYSxDQUFDLEdBQXNCLEVBQUUsRUFDcEQsV0FBVyxHQUFHLEVBQWMsRUFDNUIsVUFBVSxHQUFHLEVBQWMsRUFDM0IsU0FBUyxHQUFHLEVBQWMsRUFDMUIsb0JBQW9CLEdBQUcsS0FBSyxNQUMxQixFQUFFO0lBQ0osNkRBQTZEO0lBQzdELHFFQUFxRTtJQUNyRSwwREFBMEQ7SUFFMUQsOERBQThEO0lBQzlELGlFQUFpRTtJQUVqRSw2Q0FBNkM7SUFFN0MsOERBQThEO0lBRTlELElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3RCxtQkFBbUI7UUFDbkIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxFQUEyQyxDQUFDO0lBRTNELElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDdkUsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0QixNQUFNLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNsQixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxH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