Patreon no parece sincronizarse en nuestra instancia

Estamos en una instancia alojada en discourse.group. Tenemos configurado el complemento de Patreon para actualizar un grupo llamado Patrons, y cualquier persona de cualquier nivel debería ser incluida en ese grupo. Ahora mismo, a pesar de tener más de 1000 mecenas activos en Patreon, este grupo tiene solo ~70 miembros, lo que parece ser muy poco, especialmente considerando que, excepto por algunas personas a las que se les dieron invitaciones directas, solo hemos admitido a personas que inician sesión con Patreon.

Han pasado dos días desde que se ejecutó la sincronización según el panel del complemento en la administración, contrariamente a la documentación que sugiere que debería ejecutarse cada 6 horas, y esa última ejecución coincidió con la eliminación de varias personas de este grupo y un fallo en el registro (que parece ser una respuesta de CloudFlare y no de api.patreon.com en sí). Vemos fallos similares a intervalos de aproximadamente dos semanas.

Hacer clic en el botón “Actualizar datos de Patreon y sincronizar grupos” en el panel de administración del complemento no parece hacer nada (tenemos habilitado el registro detallado para el complemento, y no se registra nada).

Personalmente, no tengo acceso de administrador a la cuenta de Patreon a la que estamos vinculados, pero si utilizo el token de creador configurado para el complemento contra los puntos finales de la API (con curl), funciona y puedo obtener respuestas válidas, hojear las suscripciones, etc. Hubo un hilo anterior que sugería que era necesario aumentar los límites de solicitudes para esa instancia; lo hice en nuestra instancia, pero parece que no tuvo ningún efecto.

He revisado algunos hilos relevantes:

Pero por lo que puedo ver, simplemente parece que la sincronización no se está produciendo, ni manual ni programada, o al menos no con la programación 4 veces al día que implica la documentación, y como no estamos autoalojados, creo que estoy en el límite de lo que puedo inspeccionar yo mismo.

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?