Skip to content

情報公開の有効化をテナント設定で切り替える(改修案) ​

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

本体の標準機能ではありません

このページは本体を改修する場合の設計メモです。前提にした現行の実装は 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 ​

ContractSettingsTenantSettings
保存先Tenants.ContractSettings(JSON)Tenants.TenantSettings(JSON)
中身契約上の上限(ユーザー数・サイト数・容量など)と ExtensionsBackgroundServerScripts だけ
読み込みContext.SetTenantProperties() で毎リクエストTenantModel を作ったときだけ(Context にプロパティが無い)
画面なし(DB を直接書き換える前提)テナント管理画面で編集できる

改修の方針 ​

TenantSettings に bool? Publish を足し、「TenantSettings.Publish == true または ContractSettings.Extensions["Publish"] == true」なら有効にします。フォームが Parameters.Form.Enabled と Extensions["Form"] の OR にしているのと同じ形です。

TenantSettings.PublishExtensions["Publish"]結果
truetrue有効
truefalse / 未設定有効
false / nulltrue有効(従来の指定)
false / nullfalse / 未設定無効

bool? にしておけば、未設定(null)と明示的な false を区別できます。RecordingJson() では null を出力しないようにします。

改修内容 ​

1. TenantSettings にプロパティを足す ​

csharp
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 行から取り出します。

csharp
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.csPublish を足す
Libraries/Requests/Context.csTenantSettings プロパティ、SetTenantProperties() での読み込み、SetPublish() の判定
Models/Sites/SiteUtilities.cs公開タブ・エディタの表示判定
Libraries/SiteManagement/SettingsJsonConverter.Settings.csサイト設定 JSON の生成判定
Models/Tenants/TenantUtilities.csテナント管理画面のチェックボックス

移行の進め方 ​

  1. TenantSettings と判定を先に入れる。Extensions["Publish"] を設定済みのテナントはそのまま動く
  2. テナント管理画面のチェックボックスを入れる
  3. 必要なら、Extensions["Publish"] が true のテナントの TenantSettings.Publish を true にする(従来の指定も OR で残るので必須ではない)

関連ページ ​

変更履歴

第1版拡張ライブラリの読み込みと開発・デバッグ、拡張ヘッドリンク、SMTP の OAuth 送信の解説と、多言語・外部公開カレンダー・スレッド型サイトなどの改修・設計メモを追加