Patreon, похоже, не синхронизируется на нашем экземпляре

Привет,

Похоже, я выяснил причину этой проблемы, или хотя бы связанной с ней проблемы синхронизации с Patreon API v2.

У меня есть инстанс Discourse, использующий интеграцию с Patreon через API v2. Существующие пользователи Patreon по-прежнему корректно назначаются в группу patrons, но новый платящий участник не был добавлен в группу, даже после ручного запуска Update Patreon Data. Синхронизация завершилась успешно, и адрес электронной почты в Patreon точно совпадал с адресом пользователя в Discourse.

При включённом patreon_verbose_log синхронизация сообщает:

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

Затем я изучил ответ API, используемый в ApiVersion::V2.

Для первой страницы из 1000 участников:

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

Однако сами объекты member содержат адрес электронной почты:

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

Судя по коду в plugins/discourse-patreon/lib/api_version/v2.rb, MEMBER_FIELDS явно запрашивает email, но V2.extract заполняет хеш users только на основе связанных объектов user из included:

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

Кажется, он не использует entry["attributes"]["email"] из объектов member, хотя именно там Patreon возвращает адрес электронной почты в моём ответе API.

Это, вероятно, объясняет, почему синхронизация успешно получает все 1968 подписок, но сообщает 0 users synced.

Также это объясняет, почему существующие ассоциации Patreon/Discourse продолжают работать, в то время как новых участников невозможно сопоставить по электронной почте: у существующих пользователей patreon_id уже может быть сохранён в user_custom_fields, тогда как для нового участника необходимо установить связь между ID Patreon и адресом электронной почты.

Имеет ли смысл, чтобы V2.extract заполнял users непосредственно при обработке каждого участника, например:

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

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

сохраняя при этом текущую обработку included в качестве резервного варианта?