@openinc/parse-server-opendash
Version:
Parse Server Cloud Code for open.INC Stack.
92 lines (91 loc) • 3.12 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.init = init;
const config_1 = require("../features/config");
const types_1 = require("../types");
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,
config: config_1.ConfigInstance.getInstance().export(),
tenants: await getTenants(),
};
});
}
async function getTenants() {
try {
const tenants = await new Parse.Query(types_1.Tenant)
.ascending("label")
.limit(1000000)
.find({ useMasterKey: true });
return tenants.map((tenant) => {
return {
key: tenant.id,
value: tenant.id,
label: tenant.label || "",
description: tenant.description || "",
public: tenant.public || false,
icon: tenant.icon?.url() || null,
logo: tenant.logo?.url() || null,
imprintUrl: tenant.imprintUrl || "",
dataProtectionUrl: tenant.dataProtectionUrl || "",
};
});
}
catch (error) {
console.error(error);
return [];
}
}
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;
}
;