R-005 — Vencimento de filiação notifica o trg-club
TLDR: Quando uma filiação vence, o
citrg-apiempurra um webhook para otrg-clubpara que o perfil PRO seja rebaixado mesmo que a pessoa nunca mais faça login. Ocitrg-apié o iniciador do evento, e o webhook é autoritativo: só é enviado depois da guarda de renovação, e otrg-clubrebaixa direto ao recebê-lo, sem reconsultar ocitrg-api.
Given / When / Then
Dado uma filiação cujo valid_until foi ontem, e cujo usuário não tem nenhuma filiação paga com valid_until posterior
Quando o cron diário Notifications::Memberships::Expiration::ExpiredYesterdayJob roda (GoodJob, 0 8 * * *)
Então além do e-mail de lembrete, é enfileirado um NotifyTrgClubJob para aquela filiação, que faz POST de { email, register_number } para citrg/memberships/expired no trg-club
Tabela de decisão
| Situação da filiação vencida ontem | E-mail de lembrete | Notificação ao trg-club |
|---|---|---|
| sem renovação paga posterior | enviado | enviada |
com renovação paga de valid_until maior |
não enviado | não enviada |
| filiação apagada antes do job rodar | — | job descartado (discard_on ActiveRecord::RecordNotFound) |
trg-club fora do ar |
enviado | retry até 10 tentativas (~4h) |
Restrições
- A guarda de renovação vive em
BaseExpirationJob#performe é anterior tanto ao e-mail quanto à notificação: se existe qualquer filiação paga comvalid_untilmaior, a filiação é pulada por completo. A guarda não exige aprovação de admin. - O loop do cron nunca faz HTTP.
notify_externalapenas enfileira umNotifyTrgClubJobpor filiação vencida — e-mail e notificação falham de forma independente, e a falha de um membro não afeta os demais. TrgClubServicelevantaTrgClubService::Errorem qualquer falha (erro de conexão, timeout, resposta não-2xx). ONotifyTrgClubJobdeclararetry_on TrgClubService::Error, wait: :polynomially_longer, attempts: 10— janela de aproximadamente 4 horas, persistida pelo GoodJob no Postgres, então sobrevive a restart e é visível/re-executável em/good_job.- O webhook é autoritativo por decisão de projeto: reconsultar o
citrg-apino recebimento perderia o evento sempre que ocitrg-apiestivesse momentaneamente indisponível. Um rebaixamento indevido se auto-corrige no próximo login do membro (auto_subscribe_pronotrg-club). - O e-mail de lembrete de vencimento não teve o comportamento alterado por esta regra.
Configuração
| Variável | Papel |
|---|---|
TRG_CLUB_API_URL |
URL base do trg-club. Default https://api.trgclub.com/; staging https://staging-api.trg.club/ |
APOLO_ACCESS_TOKEN |
token da integração trg-club↔citrg já existente (o mesmo validado na entrada como apolo-access-token), enviado no header X-Security-Signature-Token. Não há segredo novo a configurar |
Contrato com o trg-club
- Transporte:
POSTJSON paracitrg/memberships/expired. - Autenticação: segredo compartilhado no header
X-Security-Signature-Token. - Corpo:
{ "email": "<e-mail do membro>", "register_number": <bigint> }. O e-mail vai em minúsculas. - Chave de match:
email. - Resposta: o trg-club devolve
200para aceito/conhecido/desconhecido-mas-processado e401para token inválido. Ocitrg-apinão depende do corpo da resposta.
Código
app/services/trg_club_service.rbapp/jobs/notifications/memberships/expiration/base_expiration_job.rb— hooknotify_externalapp/jobs/notifications/memberships/expiration/expired_yesterday_job.rbapp/jobs/notifications/memberships/expiration/notify_trg_club_job.rbconfig/initializers/good_job.rb— cron0 8 * * *
Teste vinculado
test/services/trg_club_service_test.rb, test/jobs/notifications/memberships/expiration/expired_yesterday_job_test.rb, test/jobs/notifications/memberships/expiration/notify_trg_club_job_test.rb