Patreon ne semble pas se synchroniser sur notre instance

Nous utilisons une instance hébergée sur discourse.group. Nous avons configuré le greffon Patreon pour mettre à jour un groupe appelé Patrons, et toute personne de n’importe quel niveau devrait être incluse dans ce groupe. Actuellement, malgré plus de 1000 mécènes actifs sur Patreon, ce groupe ne compte qu’environ 70 membres, ce qui semble beaucoup trop peu, surtout si l’on considère qu’à l’exception de quelques personnes ayant reçu des invitations directes, nous n’avons pris en charge que les personnes se connectant avec Patreon.

Il y a deux jours que la synchronisation a été exécutée selon le panneau du greffon dans l’administration, contrairement à la documentation qui suggère qu’elle devrait s’exécuter toutes les 6 heures, et cette dernière exécution a coïncidé avec le retrait de plusieurs personnes de ce groupe, et une erreur dans le journal (qui semble être une réponse de CloudFlare et non de api.patreon.com lui-même.) Nous observons des échecs similaires à des intervalles d’environ deux semaines.

Cliquer sur le bouton « Update Patreon Data & Sync Groups » (Mettre à jour les données Patreon et synchroniser les groupes) dans le panneau d’administration du greffon ne semble rien faire (nous avons activé la journalisation verbeuse pour le greffon, et rien n’est consigné.)

Je n’ai pas personnellement d’accès administrateur au compte Patreon auquel nous sommes liés, mais si j’utilise le jeton de créateur configuré pour le greffon contre les points de terminaison de l’API (avec curl), cela fonctionne et je suis capable d’obtenir des réponses valides, de parcourir les engagements, etc. Il y a eu un fil de discussion précédent qui suggérait que les limites de requête pour cette instance devaient être augmentées ; je l’ai fait sur notre instance mais cela ne semble pas avoir eu d’effet.

J’ai examiné quelques fils de discussion pertinents :

Mais d’après ce que je peux voir, il semble que la synchronisation ne se produise pas, que ce soit manuellement ou selon un calendrier, ou du moins pas à la fréquence de 4 fois par jour que la documentation implique, et comme nous n’hébergeons pas nous-mêmes, je pense que je suis à la limite de ce que je peux inspecter moi-même.

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 ?