Judith
(Judith Meyer)
2020 年 6 月 11 日午後 1:15
1
どうやら自分で追い詰められてしまったようです…
私も Rails で運営するメンバーシップサイトを持っており、Discourse API を使って、すべてのユーザーグループに対応する制限付きフォーラムグループを自動的に作成・設定しています。これは非常にうまくいっており、各グループには最初はウィキ投稿まで用意しています(コードはここに投稿しました )。
しかし、最近次のような問題に直面しました。サイト側でグループを統合する場合や、コーディネーターが誤ってメンバーを削除・追加した場合など、グループメンバーを手動で同期させる必要があるケースがあるのです。そのため、Discourse のグループメンバーをすべて削除し、その後、正しく所属すべきメンバーだけを再追加したいと考えています。
まず最初の問題:Discourse API にはグループメンバーを「すべて削除」する機能がないようです。そのため、削除したいメンバーの名前を一つずつ指定する必要があります。
2 つ目の問題:現在のグループメンバーを取得しようとしても、何らかの理由でグループ ID ではなくグループ名を要求されます。しかし、私のサイトでは Discourse が PUT/POST/DELETE リクエストで使用する ID しか保存していません。
3 つ目の問題:これは明らかなことですが、グループ ID を指定してその名前の取得方法が見つかりません。もし ID から名前を取得したいなら、200 以上のグループをすべて取得して、ID が一致するものが見つかるまでループするしかありません。これはあまりにも非現実的で、Rails の慣習にも反しています。
何か見落としているのでしょうか?
編集:@codinghorror さんは前回とても親切でした。何かご提案はありますか?
「いいね!」 4
確実ではありませんが、@justin または @blake が今週中に確認してくださるでしょうか?
「いいね!」 4
justin
(Justin DiRose)
2020 年 6 月 15 日午後 2:08
4
その点についてはおっしゃる通りです。グループリソースには ID 番号ではなく、名前でのみアクセスできます。
type: type,
order: order,
asc: params[:asc],
filter: filter
)
)
end
def show
respond_to do |format|
group = find_group(:id)
format.html do
@title = group.full_name.present? ? group.full_name.capitalize : group.name
@description_meta = group.bio_cooked.present? ? PrettyText.excerpt(group.bio_cooked, 300) : @title
render :show
end
format.json do
groups = Group.visible_groups(current_user)
groups = groups.where(automatic: false) if !guardian.is_staff?
ここで参照されている ID は、実際には ID ではなく名前です。
custom_fields = DiscoursePluginRegistry.editable_group_custom_fields
default_params << { custom_fields: custom_fields } unless custom_fields.blank?
end
default_params
end
params.require(:group).permit(*permitted_params)
end
def find_group(param_name, ensure_can_see: true)
name = params.require(param_name)
group = Group.find_by("LOWER(name) = ?", name.downcase)
guardian.ensure_can_see!(group) if ensure_can_see
group
end
def users_from_params
if params[:usernames].present?
users = User.where(username_lower: params[:usernames].split(",").map(&:downcase))
raise Discourse::InvalidParameters.new(:usernames) if users.blank?
おそらく、/g/<group-name> ルートを、現在トピックやカテゴリを処理している方法に合わせてリファクタリングするのが妥当でしょう。例えば /g/<group-name>/<id> や /g/patrons/41 のような形式にし、/g/41 も同様に機能するようにするのです。
ただし、その修正が行われるまでの間、あなたが求めていることを達成できる唯一の方法は以下の通りです:
グループ名を ID と一緒に保存する
g/<group-name>/members.json に GET リクエストを送信してメンバーを取得する
それらのメンバーをループして削除し、再同期できるようにする
「いいね!」 3
これは取り組むべき素晴らしい課題ですね。提起してくださりありがとうございます、@Judith !グループは非常に強力であり、可能性に満ちています! 私も最近、WordPress からのグループメンバーシップの維持を検討する際に、この問題に気づきました。WordPress でのサインアップやプロフィール更新時に、ユーザーが声明する国や地域、話せる言語、興味のあるテーマなどに基づいて、グループへの自動追加・削除ができるようになったら、とても素敵ですよね。
@justin の提案である、グループ名とグループ ID の両方を保存するという案は素晴らしいもので、現在この統合に取り組んでいるチームメンバーに伝えます。
UI に追加してほしいもう一つの機能として、管理者やグループオーナーが、グループから全メンバーをまとめて削除し、再度追加できる機能があります。これにより、WordPress からのエクスポートに基づいて、WordPress プロフィールの更新に伴うグループの自動追加・削除システムが整備されていなくても、定期的にグループメンバーシップを手動でリセットできるようになります。
「いいね!」 3
Falco
(Falco)
2020 年 6 月 15 日午後 4:02
6
メインサイトと Discourse の間で SSO を導入することをお勧めします。これにより、グループメンバーシップの管理が自動的に実現し、sync_sso エンドポイントを使ってメンバーシップを簡潔に更新できるようになります。
「いいね!」 4
Judith
(Judith Meyer)
2020 年 6 月 15 日午後 4:36
7
当初はSSOのみを使用していましたが、グループメンバーシップの更新がログイン時のみ行われるという問題に直面しました。再選されなかった場合や、グループへのアクセス権を失った場合、あるいはグループへのアクセス権を得た場合(制限付きグループサブフォーラムのメッセージに対してメール通知を受け取る必要がある場合)には、APIを通じてユーザーの追加・削除を行う必要があります。
「いいね!」 1
Falco
(Falco)
2020 年 6 月 15 日午後 4:51
8
この問題を解決するために sync_sso が用意されています!メンバーシップの変更が発生した際にいつでも、実質的に「バーチャル」な SSO ログインをトリガーして、ユーザーを完全に同期させることができます。
「いいね!」 6
gassim
(Al-Gassim Sharaf Addin)
2022 年 9 月 18 日午前 8:52
9
こんにちは!
この機能は現在利用可能ですか?これに関するアップデートはありますか?
よろしくお願いします!
「いいね!」 1
Judith
(Judith Meyer)
2022 年 12 月 13 日午後 1:14
10
何かアップデートはありますか? @tobiaseigen
「いいね!」 1