@ords/modules
Version:
Modules for ords-core microservices based upon proposals
193 lines (192 loc) • 6.93 kB
JavaScript
;
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;