サイト更新時の変更履歴(バージョン)
サイトの設定(タイトル・説明・テーブルの管理の各タブ)を更新すると、条件によって変更履歴(旧バージョン)が作られます。この条件は、画面から更新したか、サーバースクリプトや API から更新したかで違います。「API で設定を変えたのに履歴が残っていない」「サーバースクリプトで VerUp を指定したのに効かない」といったときに参照してください。
INFO
実装の根拠は、確認時のソースへの固定リンクで示しています。
結論
| 経路 | 履歴が作られる条件 |
|---|---|
| 画面(サイトの編集) | 「新バージョンとして保存」がオン。前回の更新者が自分以外か、前回の更新日が今日でなければ、チェックはオンで固定される |
サーバースクリプト(items.Update(サイト ID, ...)) | 「自動バージョンアップ」が「常時」なら必ず、「無効」なら作られない、「既定」なら前回の更新者・更新日で判定。モデルに書いた VerUp は無視される |
API /api/items/{id}/UpdateSite | リクエストの VerUp が true か、「自動バージョンアップ」が「常時」 |
API /api/items/{id}/UpdateSiteSettings | リクエストの VerUp が true、前回の更新者が自分以外か前回の更新日が今日でない、または「自動バージョンアップ」が「常時」 |
「自動バージョンアップ」は、テーブルの管理の「エディタ」タブにある設定(SiteSettings.AutoVerUpType)です(SiteUtilities.cs#L7546-L7566)。本来はレコードを更新したときのバージョン管理の設定ですが、サーバースクリプトと API からサイトを更新したときにも参照されます。画面からサイトを更新したときには参照されません。
判定の仕組み
履歴を作るかどうかは、最終的に Versions.VerUp() が決めます(Versions.cs#L35-L41)。SiteModel.Update() はこの結果で履歴テーブルへのコピーを行います(SiteModel.cs#L1313-L1316)。
public static bool VerUp(Context context, SiteSettings ss, bool verUp)
{
return verUp ||
(ss.SiteId > 0
&& !(ss.IsSite(context: context) && context.Action == "update")
&& ss.AutoVerUpType == AutoVerUpTypes.Always);
}- 引数の
verUp(モデルのVerUp)がtrueなら、ほかの条件を見ずに履歴を作ります。 verUpがfalseのときは、「自動バージョンアップ」が「常時」なら履歴を作ります。ただし「サイト自身をアクションupdateで更新している」場合(ss.IsSite()はSiteId == context.Id。SiteSettings.cs#L720-L723)は、この「常時」の判定を行いません。
モデルの VerUp を決めるのが Versions.MustVerUp() です(Versions.cs#L43-L61)。
public static bool MustVerUp(Context context, SiteSettings ss, BaseModel baseModel, bool isSite = false)
{
if (!isSite)
{
switch (ss.AutoVerUpType)
{
case AutoVerUpTypes.Always: return true;
case AutoVerUpTypes.Disabled: return false;
}
}
return baseModel.Updator.Id != context.UserId ||
(baseModel.UpdatedTime?.DifferentDate(context: context) ?? false);
}isSite: true で呼ぶと「自動バージョンアップ」は見ずに、前回の更新者が自分以外か、前回の更新日が今日でないときに true を返します。isSite: false(既定)だと、先に「自動バージョンアップ」の「常時」「無効」で決め、「既定」のときだけ更新者・更新日で判定します。
経路ごとに、この 2 つのメソッドへの渡し方が違います。
図を読み込み中…
画面から更新する場合
サイトの編集画面には「新バージョンとして保存」のチェックボックスがあります(SiteUtilities.cs#L6296-L6299)。このチェックの初期値は MustVerUp(isSite: true) で決まり、true のときはチェックがオンのまま変更できなくなります(HtmlVerUps.cs#L12-L34)。チェックボックスには always-send が付いていて、状態がフォームの VerUp として送られ、SiteModel.VerUp に入ります(SiteModel.cs#L1669)。
| 前回の更新 | チェックの状態 | 履歴 |
|---|---|---|
| 自分以外が更新した、または今日以外の日に更新した | オンで固定(変更不可) | 作られる |
| 今日、自分が更新した | オフ(変更可) | オンにしたときだけ作られる |
画面からの更新は context.Action が update、context.Id がサイト ID なので、VerUp() の「常時」の判定は行われません。「自動バージョンアップ」を「常時」や「無効」にしても、サイトの編集画面の挙動は変わりません。
履歴からの復元(旧バージョンを開いて復元)では、VerUp を true にしてから更新するため、必ず履歴が作られます(SiteUtilities.cs#L1581)。
サーバースクリプトから更新する場合
サーバースクリプトの items.Update() にサイトの ID を渡すと、サイトとして更新されます(ItemModel.UpdateByServerScript() の Sites 分岐。ItemModel.cs#L2245-L2269)。このときの context は items.Update 用に作り直され、アクションは update、Id は渡したサイト ID になります(ServerScriptUtilities.cs#L1401-L1427)。
SiteUtilities.UpdateByServerScript() は、渡されたモデルを SetByApi() で取り込んだ後に、MustVerUp() を isSite なし(false)で呼んで VerUp を上書きします(SiteUtilities.cs#L2218-L2239)。
| 自動バージョンアップ | 履歴 |
|---|---|
| 常時 | 作られる |
| 既定 | 前回の更新者が自分以外か、前回の更新日が今日でなければ作られる |
| 無効 | 作られない |
モデルの VerUp は効かない
SetByApi() はモデルの VerUp を読み込みますが(SiteModel.cs#L1815)、直後に MustVerUp() の結果で上書きされます。サーバースクリプトから VerUp: true を渡しても、「自動バージョンアップ」が「無効」なら履歴は作られません。
API から更新する場合
UpdateSite
/api/items/{id}/UpdateSite は SetByApi() でリクエストの VerUp を取り込み、MustVerUp() は呼びません(SiteUtilities.cs#L2114-L2176)。アクションは updatesite なので、VerUp() の「常時」の判定が行われます。
リクエストの VerUp | 自動バージョンアップ | 履歴 |
|---|---|---|
true | 任意 | 作られる |
指定なし・false | 常時 | 作られる |
指定なし・false | 既定・無効 | 作られない(前回の更新者・更新日は見ない) |
UpdateSiteSettings
/api/items/{id}/UpdateSiteSettings はサーバースクリプト・スクリプト・スタイル・HTML・プロセス・状況による制御などの設定を部分的に更新する API です(ItemsController.cs#L327-L344)。1.5.8.1 では、リクエストの VerUp が true か、MustVerUp(isSite: true) が true のときに VerUp を立てます(SiteUtilities.cs#L2481-L2486、SiteSettingsApiModel.cs#L27)。アクションは updatesitesettings なので、VerUp() の「常時」の判定も行われます。
{
"ApiVersion": 1.1,
"ApiKey": "your-api-key",
"VerUp": true,
"Scripts": [
{ "Id": 1, "Title": "sample", "Body": "console.log('updated');" }
]
}| 条件 | 履歴 |
|---|---|
リクエストの VerUp が true | 作られる |
| 前回の更新者が自分以外、または前回の更新日が今日でない | 作られる |
| 「自動バージョンアップ」が「常時」 | 作られる |
上のどれでもない(今日、自分が更新した直後で VerUp なし) | 作られない |
API キーのユーザーで同じ日に何度も設定を更新すると、2 回目以降は履歴が作られません。更新のたびに履歴を残したいときは、リクエストに "VerUp": true を入れます。
関連ページ
- サイト設定の変遷 —
SiteSettingsの Version とマイグレーション - SiteSettings(サイト設定のデータ構造)
- API ラッパーの対応表