Sync de troca de e-mail — ibft-api → onion-backend

TLDR: Criar endpoint no onion-backend para receber trocas de e-mail e disparar esse endpoint a partir do ibft-api quando um customer que comprou o Onion trocar o e-mail.

Contexto

Quando um customer troca o e-mail no checkout (ibft-api), o IbftEmailSyncService já sincroniza com Asaas, CBTRG e Apolo. O onion-backend não está incluído nessa sincronização, então o e-mail do usuário no Onion fica desatualizado — ele perde acesso ou passa a ter inconsistência de dados.

O ibft-api já tem o módulo Onion e o OnionService, que se comunicam com o onion-backend via ONION_API_URL + ONION_API_KEY. Só falta adicionar o fluxo de troca de e-mail.

Objetivos

  • Criar endpoint no onion-backend que recebe a troca de e-mail e atualiza o usuário
  • Adicionar o sync de e-mail no ibft-api para clientes que compraram o produto Onion

Fora de escopo

— (não registrado na spec original)

Mudanças

onion-backend

apps/webhooks/views.py - Adicionar a view EmailChangeWebhookView (POST, AllowAny) - Valida o token via query param ?token= (mesmo padrão do CheckoutsNotificationsView) - Usa a env var existente WEBHOOKS_CHECKOUT_NOTIFICATIONS_TOKEN (mesma origem, mesmo caller) - Chama a task assíncrona para executar a troca

apps/webhooks/serializers.py - Adicionar EmailChangeSerializer com os campos email (antigo) e new_email

apps/webhooks/tasks.py - Adicionar a task change_user_email(old_email, new_email): busca o usuário por email=old_email, atualiza para new_email, invalida o cache do usuário (mesmo padrão do signal post_save) e loga o resultado

apps/webhooks/urls.py - Adicionar a rota POST webhooks/email-change

routes/api.py - Incluir a nova URL no router principal

ibft-api

app/models/onion.rb - Adicionar webhook_send_email_payload(params) para chamar o endpoint de troca de e-mail - Endpoint: {base_url}webhooks/email-change?token={api_key} - Payload: {email: old_email, new_email: new_email}

app/services/ibft_email_sync_service.rb - Adicionar o método privado sync_onion: verifica se o customer tem algum pagamento com checkout.integration == "onion" e, se sim, chama Onion.new.webhook_send_email_payload(...) - Registra no WebhookLog com event_type: "ibft_email_sync_onion" - Chama sync_onion no método sync, junto com os demais

Como verificar

  1. Trocar o e-mail de um customer que tem um payment com checkout.integration == "onion" no admin do ibft-api
  2. Verificar que um WebhookLog com event_type: "ibft_email_sync_onion" foi criado
  3. Verificar que o usuário no onion-backend teve o e-mail atualizado
  4. Testar com customer sem produto Onion: sync_onion não deve ser chamado

Documentação

Nenhuma mudança de documentação necessária.