ken_nogi/ClaudePleasanter/MSS回覧板システム/.claude/js/resolve-names.js
Kenichiro NOGI ed33892f08 chore: 作業中の変更を整理しコミット(複数プロジェクト分)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-02 11:09:50 +09:00

84 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* resolve-names.js
* ------------------------------------------------------------
* get-master-data.js が保存した configs/master_users.json /
* master_depts.json / master_groups.json を読み込み、
* Permissions等に登場する {Type, Id} 形式の値と、ユーザー/組織/グループ名との
* 相互変換を行うユーティリティ。
*
* 使い方(他スクリプトから):
* const { loadMasterData, resolveName, resolveId } = require("./resolve-names");
* const master = loadMasterData();
* 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/master/master_*.json を読み込み、Type別に { idField, nameField, list } を返す
function loadMasterData(baseDir = path.join(__dirname, "..", "..")) {
const masterDir = path.join(baseDir, "configs", "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 };