情報公開の有効化をテナント設定で切り替える(改修案)
本体の標準機能ではありません
このページは本体を改修する場合の設計メモです。前提にした現行の実装は 1.5.8.1 です。
情報公開(Publish)は、サイトの内容をログインなしで読み取り専用として見せる機能です。1.5.8.1 では、テナントで使えるかどうかを Tenants.ContractSettings の JSON にある Extensions["Publish"] だけで決めていて、画面から切り替える手段がありません。ここでは TenantSettings に Publish を足し、テナント管理画面で切り替えられるようにする改修をまとめます。従来の Extensions["Publish"] も引き続き有効にします。
現行の実装
判定の流れ
/publishes/...(と /publishbinaries/...)へのアクセスは PublishesAttributes が new Context(tenantId: 0) を作り、context.Publish が false なら BadRequest にリダイレクトします(PublishesAttributes.cs)。Publish を決めるのは Context.SetPublish() です(Context.cs#L723-L808)。
図を読み込み中…
SetPublish() の中の IsExtensionAllowed() は、フォームだけ Parameters.Form.Enabled == true との OR にしていて、それ以外(Publish)は cs.Extensions.Get(extensionKey) だけです。
ContractSettings.Extensions(Dictionary<string, bool>)の Publish は、ほかにも次の場所で見ています。
| 場所 | 用途 |
|---|---|
SiteUtilities.cs#L4446・#L4639 | サイト設定の「公開」タブを出すか |
SiteUtilities.cs#L18158 | 公開設定のエディタを出すか |
SettingsJsonConverter.Settings.cs#L7590・#L7613 | サイト設定 JSON に公開設定を含めるか |
ContractSettings と TenantSettings
| ContractSettings | TenantSettings | |
|---|---|---|
| 保存先 | Tenants.ContractSettings(JSON) | Tenants.TenantSettings(JSON) |
| 中身 | 契約上の上限(ユーザー数・サイト数・容量など)と Extensions | BackgroundServerScripts だけ |
| 読み込み | Context.SetTenantProperties() で毎リクエスト | TenantModel を作ったときだけ(Context にプロパティが無い) |
| 画面 | なし(DB を直接書き換える前提) | テナント管理画面で編集できる |
改修の方針
TenantSettings に bool? Publish を足し、「TenantSettings.Publish == true または ContractSettings.Extensions["Publish"] == true」なら有効にします。フォームが Parameters.Form.Enabled と Extensions["Form"] の OR にしているのと同じ形です。
| TenantSettings.Publish | Extensions["Publish"] | 結果 |
|---|---|---|
| true | true | 有効 |
| true | false / 未設定 | 有効 |
| false / null | true | 有効(従来の指定) |
| false / null | false / 未設定 | 無効 |
bool? にしておけば、未設定(null)と明示的な false を区別できます。RecordingJson() では null を出力しないようにします。
改修内容
1. TenantSettings にプロパティを足す
public class TenantSettings
{
public BackgroundServerScripts BackgroundServerScripts { get; set; }
public bool? Publish { get; set; } // 追加
}TenantSettings 列はもともと JSON(nvarchar(max))なので、DB のスキーマ変更と CodeDefiner の再実行は要りません。
2. Context から TenantSettings を読めるようにする
Context に TenantSettings プロパティを足し、SetTenantProperties() の SELECT に TenantSettings() 列を加えてデシリアライズします。毎リクエストで読む列が 1 つ増えますが、同じ nvarchar(max) の ContractSettings・TopStyle・TopScript も既に読んでいます。SetTenantProperties() は CodeDefiner の生成対象ではないので直接直せます。
3. SetPublish() の判定
SetPublish() は new Context(tenantId: 0) の中で呼ばれ、この時点では SetTenantProperties() の結果は使えません。代わりに GetDataRow() の Sites と Tenants の JOIN に Tenants_TenantSettings() を足し、同じ 1 行から取り出します。
bool TrySetupController(string extensionKey, Func<DataRow, bool> validator, Action<DataRow> specificAction)
{
var dataRow = GetDataRow();
if (dataRow == null || !validator(dataRow)) return false;
var cs = dataRow.String("ContractSettings").Deserialize<ContractSettings>() ?? ContractSettings;
var ts = dataRow.String("TenantSettings").Deserialize<TenantSettings>(); // 追加
if (!IsExtensionAllowed(extensionKey, cs, ts)) return false;
SetCommonProperties(dataRow, cs);
specificAction(dataRow);
return true;
}
bool IsExtensionAllowed(string extensionKey, ContractSettings cs, TenantSettings ts)
{
if (extensionKey == "Form")
{
return Parameters.Form.Enabled == true || cs.Extensions.Get(extensionKey);
}
if (extensionKey == "Publish")
{
return ts?.Publish == true || cs.Extensions.Get(extensionKey); // 追加
}
return cs.Extensions.Get(extensionKey);
}4. サイト設定画面の表示
上の表の SiteUtilities.cs・SettingsJsonConverter.Settings.cs の各判定を、context.TenantSettings?.Publish == true || context.ContractSettings.Extensions.Get("Publish") に変えます。
5. テナント管理画面
TenantUtilities.cs のテナント編集画面に「情報公開」のチェックボックス(例: Tenants_TenantSettings_Publish)を足し、保存時に TenantSettings.Publish に反映します。
改修箇所のまとめ
| ファイル | 内容 |
|---|---|
Libraries/Settings/TenantSettings.cs | Publish を足す |
Libraries/Requests/Context.cs | TenantSettings プロパティ、SetTenantProperties() での読み込み、SetPublish() の判定 |
Models/Sites/SiteUtilities.cs | 公開タブ・エディタの表示判定 |
Libraries/SiteManagement/SettingsJsonConverter.Settings.cs | サイト設定 JSON の生成判定 |
Models/Tenants/TenantUtilities.cs | テナント管理画面のチェックボックス |
移行の進め方
TenantSettingsと判定を先に入れる。Extensions["Publish"]を設定済みのテナントはそのまま動く- テナント管理画面のチェックボックスを入れる
- 必要なら、
Extensions["Publish"]がtrueのテナントのTenantSettings.Publishをtrueにする(従来の指定も OR で残るので必須ではない)