Patreon ne semble pas se synchroniser sur notre instance

Bonjour,

Je pense avoir trouvé la cause de ce problème, ou du moins un problème de synchronisation de l’API v2 de Patreon étroitement lié.

J’utilise une instance Discourse avec l’intégration Patreon basée sur l’API v2. Les utilisateurs Patreon existants continuent d’être correctement affectés au groupe patrons, mais un nouveau membre payant n’a pas été ajouté au groupe, même après avoir exécuté manuellement Update Patreon Data. La synchronisation s’est terminée avec succès et l’adresse e-mail sur Patreon correspondait exactement à l’e-mail de l’utilisateur sur Discourse.

Avec patreon_verbose_log activé, la synchronisation signale :

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

J’ai ensuite inspecté la réponse de l’API utilisée par ApiVersion::V2.

Pour la première page de 1 000 membres :

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

Cependant, les objets member eux-mêmes contiennent l’e-mail :

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

En examinant plugins/discourse-patreon/lib/api_version/v2.rb, MEMBER_FIELDS demande explicitement email, mais V2.extract ne remplit le hash users qu’à partir des objets user associés dans included :

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

Il ne semble pas utiliser entry["attributes"]["email"] des objets member, alors que c’est là que Patreon retourne l’e-mail dans ma réponse API.

Cela semble expliquer pourquoi la synchronisation récupère avec succès les 1 968 engagements mais signale 0 users synced.

Cela explique également pourquoi les associations Patreon/Discourse existantes peuvent continuer à fonctionner alors que les nouveaux membres ne peuvent pas être appariés par e-mail : les utilisateurs existants peuvent déjà avoir leur patreon_id stocké dans user_custom_fields, tandis qu’un nouveau membre a besoin que l’association Patreon ID ↔ e-mail soit établie.

Aurait-il du sens que V2.extract remplisse directement users lors du traitement de chaque membre, par exemple :

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

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

en conservant le traitement actuel de included en tant que solution de repli ?