"use strict"; /* * SiteId=1(記録テーブル1)へ、社員・組織マスタ用のフィールドラベル(ClassHash等)と * Titleを設定する。既定はドライラン(差分・送信Body・curlコマンドの表示のみ)。 * 実際に送信するには --execute を付ける。 * * 実行: node scripts/push-master-site-schema.js [--execute] */ const { getSite: fetchSite } = require("../src/lib/pleasanterClient"); const { saveSiteSnapshot } = require("../src/lib/siteConfigStore"); const { buildHashUpdate } = require("../src/config/masterFields"); const BASE_URL = process.env.PLEASANTER_BASE_URL; const API_KEY = process.env.PLEASANTER_API_KEY; const SITE_ID = process.env.PLEASANTER_MASTER_SITE_ID; const NEW_TITLE = "社員・組織マスタ管理テーブル"; if (!BASE_URL || !API_KEY || !SITE_ID) { console.error("PLEASANTER_BASE_URL / PLEASANTER_API_KEY / PLEASANTER_MASTER_SITE_ID が未設定"); process.exit(1); } // サイト情報を取得するたびにconfigs/へ保存する(2026-08-08、ユーザー指示) async function getSite() { const data = await fetchSite({ baseUrl: BASE_URL, apiKey: API_KEY, siteId: SITE_ID }); saveSiteSnapshot(SITE_ID, data); return data; } async function updateSite(body) { const res = await fetch(`${BASE_URL.replace(/\/$/, "")}/api/items/${SITE_ID}/updatesite`, { method: "POST", headers: { "Content-Type": "application/json; charset=utf-8" }, body: JSON.stringify(body), }); const data = await res.json(); if (!res.ok || data.StatusCode !== 200) { throw new Error(`updatesite failed: ${res.status} ${JSON.stringify(data)}`); } return data; } async function main() { const execute = process.argv.includes("--execute"); const current = await getSite(); const hashUpdate = buildHashUpdate(); const labelByColumnName = { ...hashUpdate.ClassHash, ...hashUpdate.NumHash, ...hashUpdate.DateHash, ...hashUpdate.DescriptionHash, ...hashUpdate.CheckHash, }; const currentColumns = (current.SiteSettings && current.SiteSettings.Columns) || []; // ラベル定義はトップレベルのClassHash等ではなく、SiteSettings.Columns[].LabelTextへ // ネストして送る必要がある(公式マニュアルapi-site-update準拠、実機確認済み。 // トップレベルへ送ると404になる。add-existence-flag-fields.jsと同じパターン) const mergedColumns = currentColumns.map((col) => labelByColumnName[col.ColumnName] !== undefined ? { ...col, LabelText: labelByColumnName[col.ColumnName] } : col ); const body = { ApiVersion: "1.1", ApiKey: API_KEY, Title: NEW_TITLE, ReferenceType: current.ReferenceType, ParentId: current.ParentId, InheritPermission: current.InheritPermission, Permissions: current.Permissions, SiteSettings: { ...current.SiteSettings, Columns: mergedColumns }, }; console.log("--- 現状 → 希望 ---"); console.log(`Title: "${current.Title}" -> "${NEW_TITLE}"`); for (const col of currentColumns) { const wantLabel = labelByColumnName[col.ColumnName]; if (wantLabel !== undefined && wantLabel !== col.LabelText) { console.log(`${col.ColumnName}: "${col.LabelText}" -> "${wantLabel}"`); } } console.log("\n--- 送信されるBody(Columnsは件数のみ表示) ---"); console.log(JSON.stringify({ ...body, ApiKey: "****", SiteSettings: { ...body.SiteSettings, Columns: `(${mergedColumns.length}件)` } }, null, 2)); if (!execute) { console.log("\n[ドライラン] --execute を付けずに実行したため送信していません。内容を確認してから --execute を付けて再実行してください。"); return; } const result = await updateSite(body); console.log("\n[OK] 送信結果:", JSON.stringify(result)); await getSite(); // 反映後の状態をconfigs/へ保存(getSite内でsaveSiteSnapshot実行) console.log(`[OK] 反映後の状態をconfigs/${SITE_ID}/latest.jsonへ保存`); } main().catch((e) => { console.error(e); process.exit(1); });