/** * 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 SITE_ID = 496626; const baseDir = path.join(__dirname, "..", ".."); const configsDir = path.join(baseDir, "configs"); 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 = loadJson(path.join(baseDir, "config.json")); 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("他のSiteSettings(Columns/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); })();