UNPKG

mongoose-restapi-ui

Version:

Rest api library for your mongoose apps, with react ui: mongoose-restapi-ui-component react library

230 lines 9.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var model_1 = require("../definitions/model"); var PermissionClass = /** @class */ (function () { function PermissionClass(model, permission, role, options) { this.table = model.modelName; this.model = model; this.permission = permission; this.role = role; this.options = options; } PermissionClass.prototype._getReadObjects = function (user, callback) { var _a = this, table = _a.table, permission = _a.permission; if (!permission) return callback(null); permission.find({ table: table, user: user._id }, { object: 1 }, function (err, res) { if (err) return callback(err); callback(null, res.map(function (el) { return el.object; })); }); }; PermissionClass.prototype._getUserRoles = function (user, callback) { if (this.role) { if (!user.roles) return callback(null, 0); if (user.roles.length === 0) return callback(null, 0); this.role.aggregate([ { $match: { _id: { $in: user.roles } } }, { $unwind: '$schemas' }, { $match: { 'schemas.name': this.table } }, { $group: { _id: null, maxPermission: { $max: '$schemas.permission' } } } ], function (err, res) { if (err) return callback(err); if (res.length === 0) return callback(null, 0); callback(null, res[0].maxPermission); }); } else { //by default permission to delete (without permissions). callback(null, 0); } }; PermissionClass.prototype.checkUser = function (user) { if (this.permission) { if (user && user._id) return true; return false; } return true; }; PermissionClass.prototype.getMaxPermissionByTable = function (req, callback) { if (this.role) return this._getUserRoles(req.user, callback); callback(null, model_1.PermissionEnum.ADD); }; PermissionClass.prototype._getMaxPermissionByDoc = function (user, doc, callback) { if (this.permission) { return this.permission.findOne({ table: this.model.modelName, user: user._id, object: doc._id }, function (err, permObj) { if (err) return callback(err); var permission = 0; if (permObj) { permission = permObj.permission; } callback(null, permission); }); } else { callback(null, 0); } }; PermissionClass.prototype.getReadQuery = function (req, callback) { var _this = this; this._getUserRoles(req.user, function (err, role) { if (err) return callback(err); if (role >= model_1.PermissionEnum.READ) return callback(null, null); _this.options.getFilterByPermissions(req, function (err, query) { if (err) return callback(err); _this._getReadObjects(req.user, function (err, ids) { if (err) return callback(err); if (ids) { if (ids.length === 0 && !query) return callback(null, { _id: { $exists: false } }); if (ids.length === 0) return callback(null, query); if (query) return callback(null, { $and: [query, { _id: { $in: ids } }] }); return callback(null, { _id: { $in: ids } }); } return callback(null, query); }); }); }); }; PermissionClass.prototype._hasReadPermissionByOptions = function (req, doc, callback) { var _this = this; this.options.getFilterByPermissions(req, function (err, query) { if (err) return callback(err, undefined); if (query) return _this.model.findOne({ $and: [{ _id: doc._id }, query] }, function (err, doc) { if (err) return callback(err, undefined); if (doc) return callback(null, true); callback(null, false); }); callback(null, _this.role ? false : true); }); }; PermissionClass.prototype.hasReadPermission = function (req, doc, callback) { var _this = this; this._getUserRoles(req.user, function (err, role) { if (err) return callback(err, undefined); if (role >= model_1.PermissionEnum.READ) return callback(null, true); _this._getMaxPermissionByDoc(req.user, doc, function (err, permission) { if (err) return callback(err, undefined); if (permission >= model_1.PermissionEnum.READ) return callback(null, true); _this._hasReadPermissionByOptions(req, doc, callback); }); }); }; PermissionClass.prototype._hasAddPermissionByOptions = function (req, callback) { if (this.options.hasAddPermission) return this.options.hasAddPermission(req, callback); callback(null, this.role ? false : true); }; PermissionClass.prototype.hasAddPermission = function (req, callback) { var _this = this; this._getUserRoles(req.user, function (err, role) { if (err) return callback(err, undefined); if (role >= model_1.PermissionEnum.ADD) return callback(null, true); _this._hasAddPermissionByOptions(req, callback); }); }; PermissionClass.prototype._hasUpdatePermissionByOptions = function (req, doc, callback) { if (this.options.hasUpdatePermission) return this.options.hasUpdatePermission(req, doc, callback); callback(null, this.role ? false : true); }; PermissionClass.prototype.hasUpdatePermission = function (req, doc, callback) { var _this = this; this._getUserRoles(req.user, function (err, role) { if (err) return callback(err, undefined); if (role >= model_1.PermissionEnum.UPDATE) return callback(null, true); _this._getMaxPermissionByDoc(req.user, doc, function (err, permission) { if (err) return callback(err, undefined); if (permission >= model_1.PermissionEnum.UPDATE) return callback(null, true); _this._hasUpdatePermissionByOptions(req, doc, callback); }); }); }; PermissionClass.prototype._hasDeletePermissionByOptions = function (req, doc, callback) { if (this.options.hasDeletePermission) return this.options.hasDeletePermission(req, doc, callback); callback(null, this.role ? false : true); }; PermissionClass.prototype.hasDeletePermission = function (req, doc, callback) { var _this = this; this._getUserRoles(req.user, function (err, role) { if (err) return callback(err, undefined); if (role >= model_1.PermissionEnum.DELETE) return callback(null, true); _this._getMaxPermissionByDoc(req.user, doc, function (err, permission) { if (err) return callback(err, undefined); if (permission >= model_1.PermissionEnum.DELETE) return callback(null, true); _this._hasDeletePermissionByOptions(req, doc, callback); }); }); }; PermissionClass.prototype._hasAdminPermissionByOptions = function (req, doc, callback) { if (this.options.hasAdminPermission) return this.options.hasAdminPermission(req, doc, callback); callback(null, false); }; PermissionClass.prototype.hasAdminPermission = function (req, doc, callback) { var _this = this; this._getUserRoles(req.user, function (err, role) { if (err) return callback(err, undefined); if (role >= model_1.PermissionEnum.ADMIN) return callback(null, true); _this._getMaxPermissionByDoc(req.user, doc, function (err, permission) { if (err) return callback(err, undefined); if (permission >= model_1.PermissionEnum.ADMIN) return callback(null, true); _this._hasAdminPermissionByOptions(req, doc, callback); }); }); }; return PermissionClass; }()); exports.default = PermissionClass; //# sourceMappingURL=PermissionClass.js.map