ken_nogi/Pleasanter/.claude/js/resolve-names.js
Kenichiro NOGI ce58cb4be4 初回コミット: dev配下(NodeSrv/Pleasanter等)をGitea管理下に統合
GitHub(nextgroup2706/ken_nogi)は今後使わず自社Gitea運用に切替え。
NodeSrvは旧リポジトリの履歴を破棄しファイルのみ統合(Dokploy用サービスアカウントは
別途mygit-admin/NodeSrv.gitに履歴あり)。notepmエクスポート(12GB)とPleasanter
インストーラzip(208MB)はサイズが大きいため.gitignoreで除外。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 15:37:06 +09:00

90 lines
3.2 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/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 };