こんにちは、
この問題の原因、あるいは少なくとも Patreon API v2 の同期問題と密接に関連する問題を発見したかもしれません。
私は Patreon 統合(API v2)を使用している Discourse インスタンスを持っています。既存の Patreon ユーザーは引き続き patrons グループに正しく割り当てられていますが、新しい有料メンバーは、Patreon データの更新 を手動で実行してもグループに追加されませんでした。同期は正常に完了し、Patreon 上のメールアドレスはユーザーの Discourse メールアドレスと完全に一致していました。
patreon_verbose_log を有効にすると、同期は以下のように報告されます:
Patreon sync: found 4 rewards/tiers across 1 campaigns
Patreon sync complete: 1968 pledges, 0 users synced
その後、ApiVersion::V2 が使用している API レスポンスを調査しました。
最初の 1,000 人のメンバーを含むページについて:
Members in data: 1000
Included total: 1004
Included users: 1000
Keys for first included user: ["full_name"]
Included users with email: 0
しかし、member オブジェクト自体にはメールアドレスが含まれています:
Members: 1000
Keys for first member:
["currently_entitled_amount_cents", "email", "full_name",
"last_charge_date", "last_charge_status", "patron_status"]
Members with email: 928
plugins/discourse-patreon/lib/api_version/v2.rb を見ると、MEMBER_FIELDS は明示的に email をリクエストしていますが、V2.extract は included 内の関連する user オブジェクトから users ハッシュに値を設定するだけです:
(member_data["included"] || []).each do |entry|
if entry["type"] == "user" && entry["attributes"]["email"].present?
users[entry["id"]] = entry["attributes"]["email"].downcase
end
end
Patreon が私の API レスポンスでメールアドレスを返している場所が member オブジェクトであるにもかかわらず、member オブジェクトの entry["attributes"]["email"] を使用していないようです。
これにより、同期が 1,968 件の pledge を正常に取得できるのに、0 users synced と報告される理由が説明できます。
また、既存の Patreon/Discourse の関連付けが機能し続ける一方で、新しいメンバーがメールアドレスで一致できない理由も説明できます。既存のユーザーは user_custom_fields に patreon_id がすでに保存されている可能性があるのに対し、新しいメンバーには Patreon ID ↔ メールアドレスの関連付けを確立する必要があります。
V2.extract が各メンバーを処理する際に users に直接値を設定するようにするのは理にかなっているでしょうか。例えば、以下のように:
patron_id = entry["relationships"]["user"]["data"]["id"]
attrs = entry["attributes"]
if attrs["email"].present?
users[patron_id] = attrs["email"].downcase
end
現在の included の処理をフォールバックとして維持しつつ、です。