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

私たちはdiscourse.groupでホストされているインスタンスを利用しています。Patreonプラグインを設定し、「Patrons」というグループを更新するようにしており、どのティアのパトロンでもそのグループに含まれるべきです。現在、Patreonで1000人以上の有効なパトロンがいるにもかかわらず、このグループのメンバーは約70人しかおらず、特に、少数の人に直接招待を送った以外は、パトロンでのサインインのみをサポートしていることを考えると、これは少なすぎます。

プラグインの管理パネルによると、同期が実行されてから2日経過していますが、6時間ごとに実行されるはずだと文書に記載されているのとは異なり、その前回の実行は、数人がこのグループから削除されたこと、およびログにエラー(これはCloudFlareからの応答のように見え、api.patreon.com自体からのものではない)が発生したことと一致しています。同様の失敗が約2週間間隔で発生しています。

プラグインの管理パネルにある「Update Patreon Data & Sync Groups」ボタンをクリックしても何も起こらないようです(プラグインの冗長ロギングは有効になっていますが、何も記録されません)。

私自身は、関連付けられているPatreonアカウントの管理者アクセス権を持っていませんが、プラグイン用に設定されたクリエーターのトークンをAPIエンドポイントに対して(curlを使用して)使用すると機能し、有効な応答を取得したり、プレッジをページングしたりすることができます。以前のスレッドでは、そのインスタンスのリクエスト制限を増やす必要があると示唆されていました。私は自社のインスタンスでそれを実行しましたが、効果はなかったようです。

関連するスレッドをいくつか確認しました。

しかし、私が見る限りでは、同期が手動でもスケジュールでも、少なくとも文書が示唆する4日1回のスケジュールでは発生していないようで、セルフホストではないため、自分で調査できる範囲の上限に達していると思われます。

こんにちは、

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