/** * resolve-names.js * ------------------------------------------------------------ * get-master-data.js が保存した configs/master/master_users.json / * master_depts.json / master_groups.json を読み込み、 * Permissions等に登場する {Type, Id} 形式の値と、ユーザー/組織/グループ名との * 相互変換を行うユーティリティ。 * ClaudePleasanter直下に置く共通実装。全プロジェクトの薄いラッパーから require される。 * * 使い方(他スクリプトから): * const { loadMasterData, resolveName, resolveId } = require("./resolve-names"); * const master = loadMasterData(baseDir, env); // 両方省略時はresolveProjectRoot()で解決 * resolveName(master, { Type: "User", Id: 579 }); // => "福島 成佳" 等 * resolveId(master, { Type: "User", Name: "福島 成佳" }); // => [579] (一致するIdの配列) * ------------------------------------------------------------ */ const fs = require("fs"); const path = require("path"); const MASTER_FILES = { User: "master_users.json", Dept: "master_depts.json", Group: "master_groups.json", }; function readJson(p, required = true) { if (!fs.existsSync(p)) { if (required) { console.error(`[エラー] ファイルが見つかりません: ${p}`); console.error("先に node get-master-data.js を実行してください。"); process.exit(1); } return null; } return JSON.parse(fs.readFileSync(p, "utf-8")); } // configs/{env}/master/master_*.json を読み込み、Type別に { idField, nameField, list } を返す function loadMasterData(baseDir, env) { if (!baseDir || !env) { const resolved = require("./resolve-project").resolveProjectRoot(); if (!baseDir) baseDir = resolved.baseDir; if (!env) env = resolved.env; } const masterDir = path.join(baseDir, "configs", env, "master"); const usersJson = readJson(path.join(masterDir, MASTER_FILES.User)); const deptsJson = readJson(path.join(masterDir, MASTER_FILES.Dept)); const groupsJson = readJson(path.join(masterDir, MASTER_FILES.Group)); return { User: { idField: "UserId", nameField: "Name", list: usersJson?.Response?.Data || [], }, Dept: { idField: "DeptId", nameField: "DeptName", list: deptsJson?.Response?.Data || [], }, Group: { idField: "GroupId", nameField: "GroupName", list: groupsJson?.Response?.Data || [], }, }; } // { Type: "User"|"Dept"|"Group", Id } -> 名前文字列(見つからなければ "(不明:Type#Id)") function resolveName(master, { Type, Id }) { const bucket = master[Type]; if (!bucket) return `(不明な種別:${Type})`; const item = bucket.list.find((x) => String(x[bucket.idField]) === String(Id)); if (!item) return `(不明:${Type}#${Id})`; return item[bucket.nameField]; } // { Type: "User"|"Dept"|"Group", Name } -> 一致するIdの配列(完全一致、複数該当もありうる) function resolveId(master, { Type, Name }) { const bucket = master[Type]; if (!bucket) return []; return bucket.list .filter((x) => x[bucket.nameField] === Name) .map((x) => x[bucket.idField]); } module.exports = { loadMasterData, resolveName, resolveId };