"use strict"; /* * import-prod-to-test.js がDisabledフィールドを渡していなかったため、 * テスト環境で本番のDisabled(無効化)状態が未反映になっていたのを事後修正する。 * * 実行: * PLEASANTER_TEST_BASE_URL=... PLEASANTER_TEST_API_KEY=... node scripts/fix-disabled-flags.js */ const fs = require("fs"); const path = require("path"); const BASE_URL = process.env.PLEASANTER_TEST_BASE_URL; const API_KEY = process.env.PLEASANTER_TEST_API_KEY; const DATA_DIR = path.join(__dirname, "..", "data"); if (!BASE_URL || !API_KEY) { console.error("PLEASANTER_TEST_BASE_URL / PLEASANTER_TEST_API_KEY が未設定"); process.exit(1); } function parseCsv(text) { const rows = []; let row = [], field = "", inQuotes = false; const s = text.replace(/^/, ""); for (let i = 0; i < s.length; i++) { const c = s[i]; if (inQuotes) { if (c === '"') { if (s[i + 1] === '"') { field += '"'; i++; } else inQuotes = false; } else field += c; } else { if (c === '"') inQuotes = true; else if (c === ",") { row.push(field); field = ""; } else if (c === "\n") { row.push(field); rows.push(row); row = []; field = ""; } else if (c === "\r") { /* skip */ } else field += c; } } if (field.length || row.length) { row.push(field); rows.push(row); } const header = rows[0]; return rows.slice(1).filter(r => r.length === header.length).map(r => Object.fromEntries(header.map((h, i) => [h, r[i]]))); } async function api(pathname, body) { const res = await fetch(BASE_URL.replace(/\/$/, "") + pathname, { method: "POST", headers: { "Content-Type": "application/json; charset=utf-8" }, body: JSON.stringify({ ApiVersion: "1.1", ApiKey: API_KEY, ...body }), }); const data = await res.json(); if (!res.ok || data.StatusCode !== 200) { throw new Error(`${pathname} failed: ${res.status} ${JSON.stringify(data)}`); } return data; } async function main() { const deptIdMap = JSON.parse(fs.readFileSync(path.join(DATA_DIR, "test-import-maps", "dept-id-map.json"), "utf8")); const userIdMap = JSON.parse(fs.readFileSync(path.join(DATA_DIR, "test-import-maps", "user-id-map.json"), "utf8")); const depts = parseCsv(fs.readFileSync(path.join(DATA_DIR, "pleasanter_depts.csv"), "utf8")); const users = parseCsv(fs.readFileSync(path.join(DATA_DIR, "pleasanter_users.csv"), "utf8")); let deptOk = 0, deptNg = 0; for (const d of depts.filter(x => x.Disabled === "true")) { const newId = deptIdMap[d.DeptId]; if (!newId) { console.error("[dept] マッピング無し", d.DeptId, d.DeptName); deptNg++; continue; } try { await api(`/api/depts/${newId}/update`, { Disabled: true }); deptOk++; } catch (e) { console.error("[dept]", d.DeptId, "->", newId, e.message); deptNg++; } } console.log(`Depts Disabled反映: ok=${deptOk} ng=${deptNg}`); let userOk = 0, userNg = 0; for (const u of users.filter(x => x.Disabled === "true" && x.UserId !== "1")) { const newId = userIdMap[u.UserId]; if (!newId) { console.error("[user] マッピング無し", u.UserId, u.LoginId); userNg++; continue; } try { await api(`/api/users/${newId}/update`, { Disabled: true }); userOk++; } catch (e) { console.error("[user]", u.UserId, "->", newId, e.message); userNg++; } } console.log(`Users Disabled反映: ok=${userOk} ng=${userNg}`); } main().catch(e => { console.error(e); process.exit(1); });