Patreon 在我们的实例上似乎没有同步

你好,

我想我可能找到了这个问题(或者至少是一个密切相关的 Patreon API v2 同步问题)的原因。

我运行着一个使用 Patreon 集成(API v2)的 Discourse 实例。现有的 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

随后,我检查了 ApiVersion::V2 使用的 API 响应。

对于前 1,000 名成员的第一页:

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.rbMEMBER_FIELDS 明确请求了 email,但 V2.extract 仅从 included 中的相关 user 对象填充 users 哈希:

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

它似乎没有使用 member 对象中的 entry["attributes"]["email"],尽管在我的 API 响应中,Patreon 正是在那里返回电子邮件地址的。

这似乎解释了为什么同步能够成功获取所有 1,968 个订阅(pledges),却报告 0 users synced

这也解释了为什么现有的 Patreon/Discourse 关联可以继续正常工作,而新成员却无法通过电子邮件进行匹配:现有用户可能已经在 user_custom_fields 中存储了他们的 patreon_id,而新成员则需要建立 Patreon ID 与电子邮件之间的关联。

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 处理作为回退方案?