Assinaturas: Dados excluídos no Stripe, agora erros no plugin

Olá,

Estou testando este plugin para uso futuro na minha instância e encontrei um problema.

Minha conta do Stripe é nova e não foi verificada, o que significa que está usando dados de teste que posso limpar no painel do Stripe > Desenvolvedores.
O problema é que limpar os dados no Stripe não exclui os mesmos dados na instância do fórum. Isso pode resultar em uma falha na página de Faturamento > Pagamento de um usuário.

Passos para reproduzir

  1. Crie um plano de assinatura
  2. Assine um usuário ao plano. O Stripe atribuirá a ele um customer_id, como cus_abcd1234567890
  3. Limpe os dados no painel do Stripe
  4. Tente abrir novamente a página de Faturamento do usuário. Isso resultará em uma falha ao carregar /s/user/payment, com a seguinte mensagem de erro no console do navegador:
    {\"errors\":[\"No such customer: 'cus_abcd1234567890'\"]}

Após explorar o banco de dados da minha instância, encontrei dados anteriores de várias limpezas que fiz nas seguintes tabelas:

  • discourse_subscriptions_customers: causa falha na página de faturamento do usuário
  • discourse_subscriptions_products
  • discourse_subscriptions_subscriptions

As duas últimas tabelas não parecem causar falha. No entanto, elas ainda contêm dados expirados.

Excluir manualmente a(s) linha(s) problemática(s) na tabela discourse_subscriptions_customers corrige a falha do usuário. Mas fazer isso via consulta SQL é complicado e perigoso, especialmente para usuários inexperientes.

Vale notar também que esse problema não ocorre ao excluir manualmente as informações do usuário no painel do Stripe. O Stripe mantém informações arquivadas sobre ele e o marca como “excluído permanentemente”.

Soluções propostas

Se possível, implemente uma maneira para que o Stripe informe ao Discourse que os dados de teste foram limpos, e que os dados nessas tabelas devem ser excluídos.

Ou,

Nas opções do plugin, crie um botão para “limpar os dados de teste” com um grande rótulo de aviso vermelho para garantir que o administrador saiba o que está fazendo.

Isso parece ser um caso bastante específico e não algo que, neste momento, tenha interesse em tratar no plugin. Para corrigir os erros que você está vendo, será necessário executar o seguinte dentro do container:

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

Isso redefinirá todos os modelos locais, que são usados para comparação com o Stripe.

Minha recomendação para o futuro: exclua dados do Discourse, e não do Stripe. Se os registros do modelo não existirem no Discourse, os dados não serão importados do Stripe.

Obrigado pela sugestão. Testei e funciona, exceto por um pequeno erro de digitação: não há s no final de ::Product e ::Subscription. Caso contrário, ele não consegue encontrá-los.

Comandos corrigidos:

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

Você está certo - foi minha culpa!