Patreon이 우리 인스턴스에서 동기화되지 않는 것 같습니다

안녕하세요,

이 문제의 원인을 찾았거나, 적어도 Patreon API v2 동기화 문제와 밀접하게 관련된 문제를 발견한 것 같습니다.

저는 Patreon 통합 기능을 API v2로 사용하는 Discourse 인스턴스를 운영 중입니다. 기존 Patreon 사용자는 여전히 patrons 그룹에 올바르게 할당되고 있지만, 새로운 유료 멤버는 Patreon 데이터 업데이트를 수동으로 실행해도 그룹에 추가되지 않았습니다. 동기화는 성공적으로 완료되었으며, 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.rb를 살펴보면, MEMBER_FIELDS는 명시적으로 email을 요청하지만, V2.extractincluded의 관련 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

제 API 응답에서 Patreon이 이메일을 반환하는 곳은 member 객체임에도 불구하고, member 객체의 entry["attributes"]["email"]를 사용하지 않는 것으로 보입니다.

이것이 동기화는 1,968개의 후원(pledges)을 모두 성공적으로 가져오지만 0 users synced라고 보고하는 이유를 설명하는 것 같습니다.

또한 기존 Patreon/Discourse 연결은 계속 작동하면서 새 멤버는 이메일로 매칭되지 못하는 이유도 설명합니다. 기존 사용자는 이미 user_custom_fieldspatreon_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 처리를 폴백(fallback)으로 유지하면서요?