UNPKG

@openinc/parse-server-opendash

Version:
63 lines (62 loc) 2.11 kB
"use strict"; 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; }