Patreon non sembra sincronizzarsi sulla nostra istanza

Ciao,

credo di aver trovato la causa di questo problema, o almeno un problema di sincronizzazione strettamente correlato con l’API v2 di Patreon.

Ho un’istanza Discourse che utilizza l’integrazione con Patreon tramite API v2. Gli utenti Patreon esistenti continuano ad essere assegnati correttamente al gruppo patrons, ma un nuovo membro pagante non è stato aggiunto al gruppo, nemmeno dopo aver eseguito manualmente Update Patreon Data. La sincronizzazione si è completata con successo e l’indirizzo email su Patreon corrispondeva esattamente all’email dell’utente su Discourse.

Con patreon_verbose_log abilitato, la sincronizzazione riporta:

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

Ho quindi ispezionato la risposta dell’API utilizzata da ApiVersion::V2.

Per la prima pagina di 1.000 membri:

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

Tuttavia, gli oggetti member stessi contengono l’email:

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

Guardando a plugins/discourse-patreon/lib/api_version/v2.rb, MEMBER_FIELDS richiede esplicitamente email, ma V2.extract popola l’hash users solo dagli oggetti user correlati 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

Non sembra utilizzare entry["attributes"]["email"] dagli oggetti member, anche se è lì che Patreon sta restituendo l’email nella mia risposta API.

Questo sembra spiegare perché la sincronizzazione recupera con successo tutti i 1.968 pledge ma riporta 0 users synced.

Spiega anche perché le associazioni Patreon/Discourse esistenti possano continuare a funzionare mentre i nuovi membri non possono essere abbinati tramite email: gli utenti esistenti potrebbero già avere il loro patreon_id memorizzato in user_custom_fields, mentre per un nuovo membro è necessario stabilire l’associazione ID Patreon ↔ email.

Avrebbe senso che V2.extract popolasse direttamente users durante l’elaborazione di ciascun membro, ad esempio:

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

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

mantenendo l’elaborazione attuale di included come fallback?