Patreon non sembra sincronizzarsi sulla nostra istanza

Siamo su un’istanza ospitata su discourse.group. Abbiamo configurato il plug-in Patreon per aggiornare un gruppo chiamato Patrons, e chiunque di qualsiasi livello dovrebbe essere incluso in quel gruppo. Al momento, nonostante oltre 1000 sostenitori attivi su Patreon, questo gruppo ha solo circa 70 membri, il che sembra troppo piccolo, soprattutto considerando che, ad eccezione di alcune persone a cui è stato concesso un invito diretto, abbiamo supportato solo persone che accedono con Patreon.

Sono passati due giorni dall’ultima esecuzione della sincronizzazione secondo il pannello del plug-in in amministrazione, contrariamente alla documentazione che suggerisce che dovrebbe essere eseguita ogni 6 ore, e quell’ultima esecuzione è coincisa con l’espulsione di diverse persone da questo gruppo e un errore nel log (che sembra essere una risposta da CloudFlare e non da api.patreon.com stesso). Vediamo fallimenti simili a intervalli di circa due settimane.

Fare clic sul pulsante “Update Patreon Data & Sync Groups” nel pannello di amministrazione del plug-in non sembra fare nulla (abbiamo abilitato la registrazione dettagliata per il plug-in e non viene registrato nulla).

Personalmente non ho accesso amministrativo all’account Patreon a cui siamo collegati, ma se uso il token creatore configurato per il plug-in contro gli endpoint API (con curl), funziona e riesco a ottenere risposte valide, a scorrere le sottoscrizioni, ecc. C’è stata una discussione precedente che suggeriva che i limiti di richiesta per quell’istanza dovessero essere aumentati; l’ho fatto sulla nostra istanza ma sembra non aver avuto alcun effetto.

Ho esaminato alcune discussioni pertinenti:

Ma da quello che posso vedere sembra semplicemente che la sincronizzazione non stia avvenendo né manualmente né in base a un programma, o almeno non con la frequenza 4 volte al giorno che la documentazione implica, e poiché non siamo self-hosting, penso di essere al limite di ciò che posso ispezionare da solo.

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?