Patreon scheint auf unserer Instanz nicht zu synchronisieren

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?