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
JavaScript
"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