ken_nogi/Pleasanter/.claude/js/site-scripts/新・着工要因システム/apply-remark-fix-496626-full.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

129 lines
6.0 KiB
JavaScript
Raw Permalink 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.

/**
* apply-remark-fix-496626-full.js
* ------------------------------------------------------------
* updatesitesettings部分更新で送った Script Id:4 / Style Id:2 / ServerScript Id:1 の
* 修正が、HTTP 200成功を返すにもかかわらず実際にはDBに反映されていない
* 直後のgetsiteで確認しても内容もVer/UpdatedTimeも変化しないことが分かったため、
* 確実に反映される updatesite全体更新で同じ変更を送り直す。
*
* 現在のサイト全体getsiteを取得し、Title/ReferenceType/ParentId/InheritPermission/
* Permissionsはそのまま再送信、SiteSettingsもScripts[Id:4]/Styles[Id:2]/
* ServerScripts[Id:1]のBodyだけをローカルファイルの内容に差し替え、他は一切変更しない。
*
* 使い方:
* node apply-remark-fix-496626-full.js … 差分表示のみ(送信なし)
* node apply-remark-fix-496626-full.js --execute … 上記に加えて実際に送信する
* ------------------------------------------------------------
*/
const fs = require("fs");
const path = require("path");
const { findSiteDir, newModifyDir, latestModifyDir } = require("../../site-paths");
const { REPO_ROOT, loadServerConfig } = require("../../resolve-project");
const PROJECT_NAME = "新・着工要因システム";
const ENV = "production";
const SITE_ID = 496626;
const baseDir = path.join(REPO_ROOT, PROJECT_NAME);
const configsDir = path.join(baseDir, "configs", ENV);
const execute = process.argv.includes("--execute");
function loadJson(p) {
return JSON.parse(fs.readFileSync(p, "utf-8"));
}
function maskApiKey(key) {
if (!key) return key;
return key.length > 8 ? key.slice(0, 4) + "****" + key.slice(-4) : "****";
}
function timestamp() {
return new Date().toISOString().replace(/[:.]/g, "-");
}
const config = loadServerConfig(ENV);
const siteDir = findSiteDir(configsDir, SITE_ID);
const scriptBody = fs.readFileSync(path.join(siteDir, "scripts", "4_new03_一覧画面自動処理.js"), "utf-8");
const styleBody = fs.readFileSync(path.join(siteDir, "styles", "2_一覧スタイル調整.css"), "utf-8");
const serverScriptBody = fs.readFileSync(path.join(siteDir, "serverscripts", "1_一覧画面 物件詳細.js"), "utf-8");
(async () => {
console.log("[INFO] 現在のサイト情報を取得しています...");
const getUrl = `${config.BaseUrl.replace(/\/+$/, "")}/api/items/${SITE_ID}/getsite`;
const getRes = await fetch(getUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ ApiVersion: config.ApiVersion || "1.1", ApiKey: config.ApiKey }),
});
const getJson = await getRes.json();
if (getJson.StatusCode !== 200) {
console.error("[エラー] getsiteに失敗しました:", JSON.stringify(getJson).slice(0, 500));
process.exit(1);
}
const data = getJson.Response.Data;
console.log(`[OK] 取得しました現在のVer: ${data.Ver}, UpdatedTime: ${data.UpdatedTime}`);
const siteSettings = JSON.parse(JSON.stringify(data.SiteSettings));
const script4 = siteSettings.Scripts.find((s) => s.Id === 4);
const style2 = siteSettings.Styles.find((s) => s.Id === 2);
const serverScript1 = siteSettings.ServerScripts.find((s) => s.Id === 1);
if (!script4 || !style2 || !serverScript1) {
console.error("[エラー] Script Id:4 / Style Id:2 / ServerScript Id:1 のいずれかが見つかりません。");
process.exit(1);
}
console.log("========================================");
console.log(` Script/Style/ServerScript 差し替えupdatesite全体更新${execute ? "(実行)" : "(プレビューのみ)"}`);
console.log("========================================");
console.log(`Script Id:4 現状${script4.Body.length}文字 → 変更後${scriptBody.length}文字(変更${script4.Body !== scriptBody}`);
console.log(`Style Id:2 現状${style2.Body.length}文字 → 変更後${styleBody.length}文字(変更${style2.Body !== styleBody}`);
console.log(`ServerScript Id:1 現状${serverScript1.Body.length}文字 → 変更後${serverScriptBody.length}文字(変更${serverScript1.Body !== serverScriptBody}`);
console.log("他のSiteSettingsColumns/GridColumns/Processes等・Permissions・Title等は一切変更しません。");
script4.Body = scriptBody;
style2.Body = styleBody;
serverScript1.Body = serverScriptBody;
const body = {
ApiVersion: config.ApiVersion || "1.1",
ApiKey: config.ApiKey,
SiteId: SITE_ID,
Title: data.Title,
ReferenceType: data.ReferenceType,
ParentId: data.ParentId,
InheritPermission: data.InheritPermission,
Permissions: data.Permissions,
SiteSettings: siteSettings,
};
const modifyDir = latestModifyDir(siteDir) || newModifyDir(siteDir, "serverscript-remark-fix");
const ts = timestamp();
const maskedBody = { ...body, ApiKey: maskApiKey(body.ApiKey) };
const previewPath = path.join(modifyDir, `site-${SITE_ID}_full_update_preview_${ts}.json`);
fs.writeFileSync(previewPath, JSON.stringify(maskedBody, null, 2), "utf-8");
console.log(`\n[OK] 送信予定内容を保存しました: ${previewPath}`);
if (!execute) {
console.log("\n[注意] --execute が指定されていないため、送信は行っていません。");
console.log("内容を確認の上、問題なければ次を実行してください: node apply-remark-fix-496626-full.js --execute");
process.exit(0);
}
console.log("\n実際に送信しますupdatesite...");
const url = `${config.BaseUrl.replace(/\/+$/, "")}/api/items/${SITE_ID}/updatesite`;
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
});
const text = await res.text();
const resultOutPath = path.join(modifyDir, `site-${SITE_ID}_full_update_result_${ts}.json`);
fs.writeFileSync(resultOutPath, text, "utf-8");
console.log(`HTTP ${res.status} ${res.statusText}`);
console.log(`[OK] 応答を保存しました: ${resultOutPath}`);
console.log(text);
})();