From 7a8666efbb1411bafad81b420945ae923a06ab72 Mon Sep 17 00:00:00 2001 From: saopig1 <4x7sw862st@gmail.com> Date: Sat, 30 May 2026 13:17:06 +0800 Subject: [PATCH] feat(perm): resolvePermissionContext (admin = super-user) --- src/data/permissions.test.ts | 18 +++++++++++++++++- src/data/permissions.ts | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/data/permissions.test.ts b/src/data/permissions.test.ts index 9ec0bdc..61e3e16 100644 --- a/src/data/permissions.test.ts +++ b/src/data/permissions.test.ts @@ -4,7 +4,7 @@ import path from "node:path"; import os from "node:os"; import { createDatabase, type BotDatabase } from "./database.js"; import { createPermissionStore } from "./permissions.js"; -import { CAPABILITIES, BASIC_TIER_CAPABILITIES } from "./permissions.js"; +import { CAPABILITIES, BASIC_TIER_CAPABILITIES, resolvePermissionContext } from "./permissions.js"; describe("PermissionStore", () => { let dbFile: string; @@ -71,4 +71,20 @@ describe("PermissionStore", () => { store.pruneBot("botA"); expect(store.getBotAccess("u1")).toEqual(["botB"]); }); + + describe("resolvePermissionContext", () => { + it("admin gets all capabilities and all bots regardless of stored rows", () => { + const store = createPermissionStore(db.db); + const ctx = resolvePermissionContext("admin", "u1", store); + expect([...ctx.capabilities].sort()).toEqual([...CAPABILITIES].sort()); + expect(ctx.bots).toBe("all"); + }); + it("member reflects stored capabilities + bot access", () => { + const store = createPermissionStore(db.db); + store.setPermissions("u1", { capabilities: ["player.control"], bots: ["b1"] }); + const ctx = resolvePermissionContext("member", "u1", store); + expect([...ctx.capabilities]).toEqual(["player.control"]); + expect(ctx.bots).toEqual(new Set(["b1"])); + }); + }); }); diff --git a/src/data/permissions.ts b/src/data/permissions.ts index 37a66d8..556bc79 100644 --- a/src/data/permissions.ts +++ b/src/data/permissions.ts @@ -67,3 +67,23 @@ export function createPermissionStore(db: Database.Database): PermissionStore { }, }; } + +export interface PermissionContext { + capabilities: Set; + bots: "all" | Set; +} + +export function resolvePermissionContext( + role: "admin" | "member", + userId: string, + store: PermissionStore +): PermissionContext { + if (role === "admin") { + return { capabilities: new Set(CAPABILITIES), bots: "all" }; + } + const access = store.getBotAccess(userId); + return { + capabilities: new Set(store.getCapabilities(userId)), + bots: access === "all" ? "all" : new Set(access), + }; +}