gameservers-control/src/services/permissions.js
2026-06-12 14:34:44 +02:00

79 lines
1.8 KiB
JavaScript

import { getStartProfile } from "./serverLauncher.js";
function serializeGroup(group, { includePermissions = true } = {}) {
const serialized = {
id: group.id,
name: group.name,
admin: isAdminGroup(group),
createdAt: group.createdAt,
updatedAt: group.updatedAt,
};
if (includePermissions) {
serialized.permissions = normalizePermissions(group.permissions);
}
return serialized;
}
function serializeSession(group) {
if (!isAdminGroup(group)) {
return { admin: false };
}
return {
admin: true,
name: group.name,
};
}
function normalizePermissions(permissions = {}) {
return {
servers: Array.isArray(permissions.servers) ? permissions.servers : [],
};
}
function canAccessServer(group, serverId) {
if (isAdminGroup(group)) return true;
return normalizePermissions(group?.permissions).servers.includes(serverId);
}
function isAdminGroup(group) {
return group?.id === "admin";
}
function getPublicSecrets(secrets = {}) {
return Object.fromEntries(
Object.entries(secrets).filter(([key]) => !key.toLowerCase().startsWith("admin"))
);
}
function serializeServerForGroup(server, group) {
const publicSecrets = getPublicSecrets(server.secrets);
const startProfile = getStartProfile(server);
const serialized = {
id: server.id,
game: server.game,
address: server.address,
port: server.port,
heroImage: server.heroImage || null,
active: Boolean(server.active),
canStart: canAccessServer(group, server.id) && !server.active && Boolean(startProfile),
hasSecrets: Object.keys(publicSecrets).length > 0,
};
if (canAccessServer(group, server.id)) {
serialized.secrets = publicSecrets;
}
return serialized;
}
export {
canAccessServer,
isAdminGroup,
normalizePermissions,
serializeGroup,
serializeSession,
serializeServerForGroup,
};