Patreon scheint auf unserer Instanz nicht zu synchronisieren

Wir verwenden eine gehostete Instanz auf discourse.group. Wir haben das Patreon-Plugin so konfiguriert, dass es eine Gruppe namens „Patrons“ aktualisiert, und jede Person jeder Stufe sollte in dieser Gruppe enthalten sein. Derzeit hat diese Gruppe trotz über 1000 aktiver Unterstützer auf Patreon nur ca. 70 Mitglieder, was viel zu wenig erscheint, insbesondere da wir, abgesehen von einigen Personen, denen direkte Einladungen ausgesprochen wurden, nur Leute unterstützt haben, die sich mit Patreon angemeldet haben.

Laut dem Einstellungsfenster des Plugins ist die letzte Synchronisierung vor zwei Tagen gelaufen, im Gegensatz zur Dokumentation, die nahelegt, dass sie alle 6 Stunden laufen sollte. Diese letzte Ausführung fiel mit dem Ausschluss mehrerer Personen aus dieser Gruppe und einem Fehler im Protokoll zusammen (der anscheinend eine Antwort von CloudFlare und nicht von api.patreon.com selbst ist). Wir sehen ähnliche Fehler in Abständen von etwa zwei Wochen.

Das Klicken auf die Schaltfläche „Patreon-Daten aktualisieren & Gruppen synchronisieren“ im Einstellungsfenster des Plugins scheint nichts zu bewirken (wir haben die ausführliche Protokollierung für das Plugin aktiviert, und es wird nichts protokolliert).

Ich habe persönlich keinen Administratorzugriff auf das Patreon-Konto, mit dem wir verbunden sind. Wenn ich jedoch das für das Plugin eingerichtete Creator-Token gegen die API-Endpunkte verwende (mit curl), funktioniert es, und ich kann gültige Antworten erhalten, durch Engagements blättern usw. Es gab einen früheren Thread, der darauf hindeutete, dass die Anforderungslimits für diese Instanz erhöht werden mussten. Ich habe dies auf unserer Instanz getan, aber es scheint keine Auswirkungen gehabt zu haben.

Ich habe mir einige relevante Threads angesehen:

Aber nach allem, was ich sehen kann, scheint es einfach so zu sein, dass die Synchronisierung weder manuell noch nach einem Zeitplan erfolgt, oder zumindest nicht in dem 4x täglichen Zeitplan, den die Dokumentation impliziert, und da wir nicht selbst hosten, glaube ich, dass ich an der Grenze dessen angelangt bin, was ich selbst überprüfen kann.

Hallo,

ich glaube, ich habe die Ursache dieses Problems gefunden, oder zumindest ein eng damit verwandtes Synchronisationsproblem mit der Patreon API v2.

Ich habe eine Discourse-Instanz, die die Patreon-Integration mit API v2 nutzt. Bestehende Patreon-Nutzer werden weiterhin korrekt der Gruppe patrons zugewiesen, aber ein neuer zahlender Mitglied wurde der Gruppe nicht hinzugefügt, selbst nach manuellem Ausführen von Patreon-Daten aktualisieren. Die Synchronisation wurde erfolgreich abgeschlossen und die E-Mail-Adresse bei Patreon stimmte exakt mit der E-Mail-Adresse des Nutzers in Discourse überein.

Wenn patreon_verbose_log aktiviert ist, meldet die Synchronisation:

Patreon sync: found 4 rewards/tiers across 1 campaigns
Patreon sync complete: 1968 pledges, 0 users synced

Ich habe dann die API-Antwort inspiziert, die von ApiVersion::V2 verwendet wird.

Für die erste Seite mit 1.000 Mitgliedern:

Members in data: 1000
Included total: 1004
Included users: 1000
Keys for first included user: ["full_name"]
Included users with email: 0

Die member-Objekte selbst enthalten jedoch die E-Mail-Adresse:

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

Wenn man sich plugins/discourse-patreon/lib/api_version/v2.rb ansieht, fordert MEMBER_FIELDS explizit email an, aber V2.extract befüllt den users-Hash nur aus den zugehörigen user-Objekten in included:

(member_data["included"] || []).each do |entry|
  if entry["type"] == "user" && entry["attributes"]["email"].present?
    users[entry["id"]] = entry["attributes"]["email"].downcase
  end
end

Es scheint, als würde entry["attributes"]["email"] aus den member-Objekten nicht verwendet, obwohl Patreon die E-Mail-Adresse in meiner API-Antwort genau dort zurückgibt.

Das scheint zu erklären, warum die Synchronisation zwar alle 1.968 Pledges erfolgreich abrufen kann, aber 0 users synced meldet.

Es erklärt auch, warum bestehende Patreon/Discourse-Verknüpfungen weiterhin funktionieren, während neue Mitglieder nicht über die E-Mail-Adresse abgeglichen werden können: Bei bestehenden Nutzern ist die patreon_id möglicherweise bereits in user_custom_fields gespeichert, während für ein neues Mitglied die Verknüpfung zwischen Patreon-ID ↔ E-Mail-Adresse erst hergestellt werden muss.

Hätte es Sinn, dass V2.extract den users-Hash direkt beim Verarbeiten jedes Mitglieds befüllt, zum Beispiel:

patron_id = entry["relationships"]["user"]["data"]["id"]
attrs = entry["attributes"]

if attrs["email"].present?
  users[patron_id] = attrs["email"].downcase
end

während die aktuelle Verarbeitung von included als Fallback beibehalten wird?