84 lines
2.9 KiB
JavaScript
84 lines
2.9 KiB
JavaScript
/**
|
||
* 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 };
|