UNPKG

@ords/modules

Version:

Modules for ords-core microservices based upon proposals

193 lines (192 loc) 6.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const rxjs_1 = require("rxjs"); // root for commands bound to let root = 'db'; class Protect { /** * Create and bind hooks to msr * @param msr reference to microservice registry * @param hooks hooks that needs to be enabled within this */ constructor(msr) { this.schema = {}; this.authRule = {}; msr.addPreHook(root, '/create/update/g', this.checkFollowSchemaStrict.bind(this)); msr.addPreHook(root, 'read', this.checkResourceExist.bind(this)); msr.addPreHook(root, 'patch', this.checkFollowSchema.bind(this)); msr.addPreHook(root, '*', this.checkAuthRule.bind(this)); } setSchema(key, schema) { // bind schema this.schema[key] = schema; } setAuthRule(key, rule) { // bind schema this.authRule[key] = rule; } /** * Check that a given resource exists by a schema existing for it * @param request */ checkResourceExist(request) { // reference to total package let tempPackage = { query: undefined, resource: undefined }; // perform new package handling request.package = request.package.map((value) => { tempPackage[value[0]] = value[1]; return value; }).concat(rxjs_1.Observable.create((handle) => { // create new inner request let innerRequest = Object.assign({}, request); // add reference to old package innerRequest.package = tempPackage; // check validation to run and run it if (innerRequest.package.runValidations && innerRequest.package.resource in this.schema) { handle.complete(); } else if (innerRequest.package.runValidations) { handle.error(new Error('SCHEMA UNDEFINED')); } else { handle.complete(); } })); return request; } ; /** * Check that a given rule for a schema is followed * @param request */ checkAuthRule(request) { // reference to total package let tempPackage = { query: undefined, resource: undefined }; // perform new package handling request.package = request.package.map((value) => { tempPackage[value[0]] = value[1]; return value; }).concat(rxjs_1.Observable.create((handle) => { // create new inner request let innerRequest = Object.assign({}, request); // add reference to old package innerRequest.package = tempPackage; // check validation to run and run it if (innerRequest.package.runValidations && innerRequest.package.resource in this.authRule) { this.authRule[innerRequest.package.resource](innerRequest, handle); } else { handle.complete(); } })); return request; } ; /** * Check that data follows given schema scritly * @param request */ checkFollowSchemaStrict(request) { // reference to total package let tempPackage = { query: undefined, resource: undefined }; // perform new package handling request.package = request.package.map((value) => { tempPackage[value[0]] = value[1]; return value; }).concat(rxjs_1.Observable.create((handle) => { // create new inner request let innerRequest = Object.assign({}, request); // add reference to old package innerRequest.package = tempPackage; // check validation to run and run it if (innerRequest.package.runValidations && innerRequest.package.resource in this.schema) { try { handle.next(['data', this.schema[innerRequest.package.resource].validate(innerRequest.package.data, true)]); handle.complete(); } catch (e) { // check if object error if (Object.keys(e).length !== 0) { // array of total erros let totalErr = []; for (let err of Object.keys(e)) { totalErr.push(err + ': ' + e[err].toString()); } handle.error(new Error(totalErr.join(','))); } else { handle.error(e); } } } else if (innerRequest.package.runValidations) { handle.error(new Error('SCHEMA UNDEFINED')); } else { handle.complete(); } })); return request; } ; /** * Check that data follows given schema non-strictly * @param request */ checkFollowSchema(request) { // reference to total package let tempPackage = { query: undefined, resource: undefined }; // perform new package handling request.package = request.package.map((value) => { tempPackage[value[0]] = value[1]; return value; }).concat(rxjs_1.Observable.create((handle) => { // create new inner request let innerRequest = Object.assign({}, request); // add reference to old package innerRequest.package = tempPackage; // check validation to run and run it if (innerRequest.package.runValidations && innerRequest.package.resource in this.schema) { try { handle.next(['data', this.schema[innerRequest.package.resource].validate(innerRequest.package.data, false)]); handle.complete(); } catch (e) { // check if object error if (Object.keys(e).length !== 0) { // array of total erros let totalErr = []; for (let err of Object.keys(e)) { totalErr.push(err + ': ' + e[err].toString()); } handle.error(new Error(totalErr.join(','))); } else { handle.error(e); } } } else if (innerRequest.package.runValidations) { handle.error(new Error('SCHEMA UNDEFINED')); } else { handle.complete(); } })); return request; } ; } exports.Protect = Protect;