Hola,
Creo que he encontrado la causa de este problema, o al menos un problema de sincronización con la API v2 de Patreon estrechamente relacionado.
Tengo una instancia de Discourse que utiliza la integración de Patreon con la API v2. Los usuarios existentes de Patreon siguen asignándose correctamente al grupo patrons, pero un nuevo miembro pagador no se añadió al grupo, incluso después de ejecutar manualmente Update Patreon Data. La sincronización se completó con éxito y la dirección de correo electrónico en Patreon coincidía exactamente con el correo electrónico del usuario en Discourse.
Con patreon_verbose_log habilitado, la sincronización informa:
Patreon sync: found 4 rewards/tiers across 1 campaigns
Patreon sync complete: 1968 pledges, 0 users synced
Luego inspeccioné la respuesta de la API utilizada por ApiVersion::V2.
Para la primera página de 1.000 miembros:
Members in data: 1000
Included total: 1004
Included users: 1000
Keys for first included user: ["full_name"]
Included users with email: 0
Sin embargo, los propios objetos member contienen el correo electrónico:
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
Al revisar plugins/discourse-patreon/lib/api_version/v2.rb, MEMBER_FIELDS solicita explícitamente email, pero V2.extract solo rellena el hash users a partir de los objetos user relacionados en included:
(member_data["included"] || []).each do |entry|
if entry["type"] == "user" && entry["attributes"]["email"].present?
users[entry["id"]] = entry["attributes"]["email"].downcase
end
end
No parece utilizar entry["attributes"]["email"] de los objetos member, a pesar de que es allí donde Patreon está devolviendo el correo electrónico en mi respuesta de la API.
Esto parece explicar por qué la sincronización recupera con éxito las 1.968 suscripciones, pero informa 0 users synced.
También explica por qué las asociaciones existentes entre Patreon/Discourse pueden seguir funcionando mientras que los nuevos miembros no pueden coincidir por correo electrónico: los usuarios existentes pueden tener su patreon_id ya almacenado en user_custom_fields, mientras que un nuevo miembro necesita que se establezca la asociación ID de Patreon ↔ correo electrónico.
¿Tendría sentido que V2.extract rellenara users directamente mientras procesa cada miembro, por ejemplo:
patron_id = entry["relationships"]["user"]["data"]["id"]
attrs = entry["attributes"]
if attrs["email"].present?
users[patron_id] = attrs["email"].downcase
end
mientras se mantiene el procesamiento actual de included como respaldo?