구독: Stripe에서 데이터 삭제 후 플러그인 오류 발생

안녕하세요,

현재 이 플러그인을 내 인스턴스에서 향후 사용할 목적으로 테스트하고 있었는데 문제가 발생했습니다.

제 Stripe 계정은 신규이며 인증이 완료되지 않아 Stripe 대시보드 > Developers에서 삭제할 수 있는 테스트 데이터를 사용하고 있습니다.
문제는 Stripe에서 데이터를 삭제해도 포럼 인스턴스의 동일한 데이터가 삭제되지 않는다는 점입니다. 이로 인해 사용자의 Billing > Payment 페이지가 충돌할 수 있습니다.

재현 단계

  1. 구독 플랜 생성
  2. 사용자를 해당 플랜에 구독. Stripe는 사용자에게 cus_abcd1234567890과 같은 customer_id를 부여합니다.
  3. Stripe 대시보드에서 데이터 삭제
  4. 사용자의 Billing 페이지를 다시 열면 /s/user/payment 로드 시 충돌이 발생하며, 웹 브라우저 콘솔에 다음 응답 텍스트가 표시됩니다:
    {\"errors\":[\"No such customer: 'cus_abcd1234567890'\"]}

인스턴스의 데이터베이스를 탐색해 보니, 여러 번 수행한 삭제 작업의 이전 데이터가 다음 테이블에서 발견되었습니다:

  • discourse_subscriptions_customers : 사용자 결제 페이지 충돌을 유발합니다.
  • discourse_subscriptions_products
  • discourse_subscriptions_subscriptions

마지막 두 테이블은 충돌을 유발하지 않는 것으로 보입니다. 그러나 여전히 만료된 데이터를 포함하고 있습니다.

discourse_subscriptions_customers의 문제 있는 행을 수동으로 삭제하면 사용자의 충돌이 해결됩니다. 하지만 이를 SQL 요청을 통해 수행해야 하는 것은 복잡하고 위험하며, 특히 경험이 적은 사용자에게는 더욱 그렇습니다.

또한 Stripe 대시보드에서 사용자 정보를 수동으로 삭제하는 경우 이 문제가 발생하지 않는다는 점도 주목할 만합니다. Stripe는 여전히 그의 아카이브된 정보를 유지하며 그를 "영구 삭제됨"으로 표시합니다.

제안된 해결책

가능하다면 Stripe가 테스트 데이터가 삭제되었음을 Discourse에 알리는 방법을 마련하고, 해당 테이블의 데이터를 삭제하도록 해야 합니다.

또는,

플러그인 옵션에 “테스트 데이터 삭제” 버튼과 함께 관리자가 자신이 무엇을 하고 있는지 알 수 있도록 큰 빨간색 경고 라벨을 추가하는 방법도 있습니다.

이것은 다소 예외적인 케이스(edge case)로 보입니다. 현재 플러그인에서 이를 처리할 계획은 없습니다. 확인 중인 오류를 수정하려면 컨테이너 내부에서 다음을 실행해야 합니다:

rails c
DiscourseSubscriptions::Customer.destroy_all
DiscourseSubscriptions::Products.destroy_all
DiscourseSubscriptions::Subscriptions.destroy_all

이렇게 하면 Stripe와 비교에 사용되는 모든 로컬 모델이 초기화됩니다.

향후 권장 사항: Stripe가 아닌 Discourse에서 데이터를 삭제하세요. Discourse에 모델 레코드가 존재하지 않으면 Stripe에서 데이터를 가져오지 않습니다.

제안해 주셔서 감사합니다. 테스트해 봤는데 동작은 하는데 작은 오타가 하나 있습니다: ::Product와 ::Subscription의 끝에 s가 없어야 합니다. 그렇지 않으면 해당 클래스를 찾을 수 없습니다.

수정된 명령어:

rails c
DiscourseSubscriptions::Customer.destroy_all
DiscourseSubscriptions::Product.destroy_all
DiscourseSubscriptions::Subscription.destroy_all

맞아요, 제 실수였네요!