Patreonが私たちのインスタンスで同期されていないようです

こんにちは、

この問題の原因、あるいは少なくとも 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.extractincluded 内の関連する 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_fieldspatreon_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 の処理をフォールバックとして維持しつつ、です。