Skip to content

サイト更新時の変更履歴(バージョン) ​

第2版作成 最終更新 (日本時間)
確認バージョン1.5.8.1

サイトの設定(タイトル・説明・テーブルの管理の各タブ)を更新すると、条件によって変更履歴(旧バージョン)が作られます。この条件は、画面から更新したか、サーバースクリプトや 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)。

csharp
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)。

csharp
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() の「常時」の判定も行われます。

json
{
    "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 を入れます。

関連ページ ​

変更履歴

第2版記事の確認版を繰り返す表現を整理する
第1版サイト設定の変更履歴・拡張 SQL の外部 DB 接続・サイト名の解決・API ラッパー・ApiVersion の解説と、関連する改修・設計メモを追加