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?