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
- Trocar o e-mail de um customer que tem um payment com
checkout.integration == "onion"no admin do ibft-api - Verificar que um
WebhookLogcomevent_type: "ibft_email_sync_onion"foi criado - Verificar que o usuário no onion-backend teve o e-mail atualizado
- Testar com customer sem produto Onion:
sync_onionnão deve ser chamado
Documentação
Nenhuma mudança de documentação necessária.