2026-05-16 15:10:27 +01:00
|
|
|
const CONFIG_FILES = [
|
|
|
|
|
"supportbot",
|
|
|
|
|
"ticket-panel",
|
|
|
|
|
"commands",
|
|
|
|
|
"messages",
|
|
|
|
|
"supportbot-ai",
|
2026-07-26 20:33:00 +01:00
|
|
|
"api",
|
2026-05-16 15:10:27 +01:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const ROLES = ["owner", "admin", "moderator", "editor", "viewer", "custom"];
|
|
|
|
|
|
|
|
|
|
function configMap(view, edit) {
|
|
|
|
|
const configs = {};
|
|
|
|
|
for (const file of CONFIG_FILES) {
|
|
|
|
|
configs[file] = { view: Boolean(view), edit: Boolean(edit) };
|
|
|
|
|
}
|
|
|
|
|
return configs;
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-10 20:15:00 +01:00
|
|
|
function fullPermissions(rawYaml = true, userManage = true) {
|
2026-05-16 15:10:27 +01:00
|
|
|
return {
|
|
|
|
|
overview: true,
|
2026-08-06 16:30:04 +01:00
|
|
|
tickets: true,
|
2026-05-16 15:10:27 +01:00
|
|
|
logs: true,
|
|
|
|
|
transcripts: true,
|
2026-08-10 20:15:00 +01:00
|
|
|
rawYaml: Boolean(rawYaml),
|
2026-05-16 15:10:27 +01:00
|
|
|
settings: { view: true, update: true },
|
|
|
|
|
configs: configMap(true, true),
|
2026-08-10 20:15:00 +01:00
|
|
|
users: { view: true, manage: Boolean(userManage) },
|
2026-05-16 15:10:27 +01:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function permissionsFromRole(role, customPermissions) {
|
|
|
|
|
switch (role) {
|
|
|
|
|
case "owner":
|
2026-08-10 20:15:00 +01:00
|
|
|
return fullPermissions(true, true);
|
2026-05-16 15:10:27 +01:00
|
|
|
case "admin":
|
2026-08-10 20:15:00 +01:00
|
|
|
return fullPermissions(false, false);
|
2026-05-16 15:10:27 +01:00
|
|
|
case "moderator":
|
|
|
|
|
return {
|
|
|
|
|
overview: true,
|
2026-08-06 16:30:04 +01:00
|
|
|
tickets: true,
|
2026-05-16 15:10:27 +01:00
|
|
|
logs: true,
|
|
|
|
|
transcripts: true,
|
2026-08-10 20:15:00 +01:00
|
|
|
rawYaml: false,
|
2026-05-16 15:10:27 +01:00
|
|
|
settings: { view: true, update: false },
|
|
|
|
|
configs: configMap(true, false),
|
|
|
|
|
users: { view: false, manage: false },
|
|
|
|
|
};
|
|
|
|
|
case "editor":
|
|
|
|
|
return {
|
|
|
|
|
overview: true,
|
2026-08-06 16:30:04 +01:00
|
|
|
tickets: true,
|
2026-05-16 15:10:27 +01:00
|
|
|
logs: true,
|
|
|
|
|
transcripts: false,
|
2026-08-10 20:15:00 +01:00
|
|
|
rawYaml: false,
|
2026-05-16 15:10:27 +01:00
|
|
|
settings: { view: true, update: false },
|
|
|
|
|
configs: configMap(true, true),
|
|
|
|
|
users: { view: false, manage: false },
|
|
|
|
|
};
|
|
|
|
|
case "viewer":
|
|
|
|
|
return {
|
|
|
|
|
overview: true,
|
2026-08-06 16:30:04 +01:00
|
|
|
tickets: true,
|
2026-05-16 15:10:27 +01:00
|
|
|
logs: true,
|
|
|
|
|
transcripts: true,
|
2026-08-10 20:15:00 +01:00
|
|
|
rawYaml: false,
|
2026-05-16 15:10:27 +01:00
|
|
|
settings: { view: true, update: false },
|
|
|
|
|
configs: configMap(true, false),
|
|
|
|
|
users: { view: false, manage: false },
|
|
|
|
|
};
|
|
|
|
|
case "custom":
|
|
|
|
|
return normalizePermissions(customPermissions);
|
|
|
|
|
default:
|
|
|
|
|
return permissionsFromRole("viewer");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function normalizePermissions(input) {
|
|
|
|
|
const base = permissionsFromRole("viewer");
|
|
|
|
|
if (!input || typeof input !== "object") return base;
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
overview: input.overview ?? base.overview,
|
2026-08-06 16:30:04 +01:00
|
|
|
tickets: input.tickets ?? input.overview ?? base.tickets,
|
2026-05-16 15:10:27 +01:00
|
|
|
logs: input.logs ?? base.logs,
|
|
|
|
|
transcripts: input.transcripts ?? base.transcripts,
|
2026-08-10 20:15:00 +01:00
|
|
|
rawYaml: Boolean(input.rawYaml ?? input.configs?.rawYaml ?? base.rawYaml),
|
2026-05-16 15:10:27 +01:00
|
|
|
settings: {
|
|
|
|
|
view: input.settings?.view ?? base.settings.view,
|
|
|
|
|
update: input.settings?.update ?? base.settings.update,
|
|
|
|
|
},
|
|
|
|
|
configs: CONFIG_FILES.reduce((acc, file) => {
|
|
|
|
|
acc[file] = {
|
|
|
|
|
view: input.configs?.[file]?.view ?? base.configs[file].view,
|
|
|
|
|
edit: input.configs?.[file]?.edit ?? base.configs[file].edit,
|
|
|
|
|
};
|
|
|
|
|
return acc;
|
|
|
|
|
}, {}),
|
|
|
|
|
users: {
|
|
|
|
|
view: input.users?.view ?? base.users.view,
|
|
|
|
|
manage: input.users?.manage ?? base.users.manage,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function hasPermission(permissions, check) {
|
|
|
|
|
if (!permissions) return false;
|
|
|
|
|
|
|
|
|
|
if (check === "overview") return Boolean(permissions.overview);
|
2026-08-06 16:30:04 +01:00
|
|
|
if (check === "tickets") return Boolean(permissions.tickets ?? permissions.overview);
|
2026-05-16 15:10:27 +01:00
|
|
|
if (check === "logs") return Boolean(permissions.logs);
|
|
|
|
|
if (check === "transcripts") return Boolean(permissions.transcripts);
|
2026-08-10 20:15:00 +01:00
|
|
|
if (check === "configs.raw_yaml" || check === "configs.rawYaml" || check === "rawYaml") {
|
|
|
|
|
return Boolean(permissions.rawYaml ?? permissions.configs?.rawYaml ?? false);
|
|
|
|
|
}
|
2026-05-16 15:10:27 +01:00
|
|
|
if (check === "settings.view") return Boolean(permissions.settings?.view);
|
|
|
|
|
if (check === "settings.update") return Boolean(permissions.settings?.update);
|
|
|
|
|
if (check === "users.view") return Boolean(permissions.users?.view);
|
|
|
|
|
if (check === "users.manage") return Boolean(permissions.users?.manage);
|
|
|
|
|
|
|
|
|
|
const configView = check.match(/^configs\.([a-z0-9-]+)\.view$/);
|
|
|
|
|
if (configView) {
|
|
|
|
|
const file = configView[1];
|
|
|
|
|
return Boolean(permissions.configs?.[file]?.view);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const configEdit = check.match(/^configs\.([a-z0-9-]+)\.edit$/);
|
|
|
|
|
if (configEdit) {
|
|
|
|
|
const file = configEdit[1];
|
|
|
|
|
return Boolean(permissions.configs?.[file]?.edit);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function canAccessConfig(permissions, file, mode = "view") {
|
|
|
|
|
if (!CONFIG_FILES.includes(file)) return false;
|
|
|
|
|
return hasPermission(permissions, `configs.${file}.${mode}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
CONFIG_FILES,
|
|
|
|
|
ROLES,
|
|
|
|
|
fullPermissions,
|
|
|
|
|
permissionsFromRole,
|
|
|
|
|
normalizePermissions,
|
|
|
|
|
hasPermission,
|
|
|
|
|
canAccessConfig,
|
|
|
|
|
};
|