@openinc/parse-server-opendash
Version:
Parse Server Cloud Code for open.INC Stack.
63 lines (62 loc) • 2.11 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.init = init;
async function init(name) {
Parse.Cloud.define(name, async (request) => {
const userId = request.user?.id;
let roles = [];
if (request.user) {
// TODO, search roles recursivly
const roleObjects = await new Parse.Query(Parse.Role)
.equalTo("users", request.user)
.find({ useMasterKey: true });
roles = roleObjects.map((role) => role.getName());
}
const parseSchema = await Parse.Schema.all();
const schema = parseSchema
.map((s) => {
const clp = s.classLevelPermissions;
return {
className: s.className,
fields: s.fields,
evaluatedClassLevelPermissions: {
find: evaluateClassLevelPermission(userId, roles, clp?.find),
count: evaluateClassLevelPermission(userId, roles, clp?.count),
get: evaluateClassLevelPermission(userId, roles, clp?.get),
create: evaluateClassLevelPermission(userId, roles, clp?.create),
update: evaluateClassLevelPermission(userId, roles, clp?.update),
delete: evaluateClassLevelPermission(userId, roles, clp?.delete),
},
};
})
.filter((s) => {
const p = s.evaluatedClassLevelPermissions;
return Object.values(p).some(Boolean);
});
return {
userId,
roles,
schema,
};
});
}
function evaluateClassLevelPermission(userId, roles, permissions) {
if (!permissions) {
return false;
}
if (permissions["*"]) {
return true;
}
if (userId && permissions.requiresAuthentication) {
return true;
}
if (userId && permissions[userId]) {
return true;
}
for (const role of roles) {
if (permissions[`role:${role}`]) {
return true;
}
}
return false;
}
;