Babble: 管理者は「グループ所有者」のみ表示に設定されたグループを確認できない

私が運営しているフォーラムでこの問題が発生しました。再現手順は以下の通りです:

  1. 管理者として新しいグループを作成
  2. 表示設定を「グループオーナー」に設定
  3. グループを作成
  4. /g に戻る
  5. グループが表示されない

コンソールで Group.find_by(name: <name>) を実行して確認すると、正しく返却されます。表示設定を「グループオーナーとスタッフ」に変更すると、正しく表示されます。

これは意図的な仕様でない限り、この表示レベルではモデレーターではなくとも管理者がグループを表示できると想定されます。

この挙動には、昨日 2.4.0.beta2 へのアップグレードを行うまで気づいていませんでした。

再読み込みは役立ちますか?

いいえ、JSON エンドポイントを呼び出しても、グループは管理者として表示されません。

最近これに取り組んだので、確認します。

そうね。あなたが見過ごすようなことではなかったと思うけど、それが私には唯一の手段だったの。:wink:

@justin さん、この問題は再現できません。ローカル環境と DO ホスティングインスタンスの両方で試しましたが、2 つの異なる管理者アカウントからグループを作成しようとしました。いずれの場合も、管理者はすべてのグループを閲覧できています。

おかしいな。クリーンインストールで試してみないと。手持ちの本番インスタンスでは確実に再現できます。アップデートして、そこから進めましょう。

新規インストールで試しましたが、@pmusaraj 様と同じ結果になりました。おそらく、使用中のプラグインが原因ではないかと推測します。原因が判明次第、改めてご報告いたします。

私もこの問題に遭遇しました…

プラグインも使っていますか?どのプラグインですか(Discourse が作成・配布していないものに焦点を当てて)…それとも、これは新しい回帰現象だと言っているのですか、@justin

こんにちは。グループの可視性を「グループオーナー」から「グループオーナー、メンバー」に変更したら、再び表示されるようになりました。「グループオーナー」に限定された場合のグループ設定に関するコードに何か不具合があるのでしょうか?

@outofthebox 偶然でも、Babble チャットプラグインがインストールされていましたか?そのプラグインをインスタンスから削除した後、それが原因で問題が再発したようです。そのプラグインをアンインストールして再構築したところ、グループの可視性が復元されました。

@justin 素晴らしい発見ですね。Babble のソースコードを簡単に確認したところ、コアのグループに関する私の更新と競合しているようです。Babble は visibility_level: 4 に対してハードコードされたルールを追加しており、これが現在コア内の owners グループと競合しています。

@gdpelican さんがお時間のある時に確認していただけると幸いです。

現在の Discourse のバージョンでこれを修正するにはどうすればよいですか?
このコードを削除すべきでしょうか? .where.not(visibility_level: 4)

  @@visible_group_scope = method(:visible_groups).clone
  scope :visible_groups, ->(user, order = nil, opts = {}) {
    @@visible_group_scope.call(user, order, opts)
  }
end

はい、この問題についてもう少し深く調査しました。

どうやら、Babble が独自に visibility_level を割り当てて使用しており、次の未使用の定数(4)を採用していたようです。

数週間前、Discourse コアコードも新しい visibility_level を追加し、同様に次の未使用の定数(これも 4)を採用してしまいました。これにより、この定数の重複使用が発生しました。

したがって、修正は以下の 2 段階で構成されます。

  • Babble が使用する visibility_level を変更します。これは簡単です。将来的な競合を避けるために、各プラグインが独自の BASE_VISIBILITY_LEVEL を登録するようにすれば完璧ですが、現時点では単に別の値(例えば 1001)を選ぶだけでも構いません。
  • visibility_level が 4 のグループを新しい定数に変更しますが、これは Babble によって使用されていたグループに限定します。

このクエリで正しいグループが選択されますか、@gdpelican さん?

UPDATE groups 
SET visibility_level = 1001 
WHERE id IN (
  SELECT g.id 
  FROM topics t 
  LEFT JOIN topic_allowed_groups tag ON tag.topic_id = t.id 
  LEFT JOIN groups g ON g.id = tag.group_id 
  WHERE t.archetype='chat');

こんにちは、すみません。数日中に確認いたしますが、修正の一般的な概要は完璧です。バックポートが難しい部分になりますので、近々詳しく確認します。

さて、この問題の修正をプッシュしました。他に不審な点がございましたら、お知らせください。

1 つの問題が見つかりました:Backfiller 機能にはマルチサイトサポートが不足しているようです(利用可能な接続をループする必要があります)

@RGJ それについてプルリクエストを作成していただけますか?私はマージできますが、今後数日は接続が限られる予定です。

もちろん、今週末にそれができるはずです。