Esse projeto tem como objetivo facilitar a manipulação de eventos de webhooks muito comuns em meios de pagamentos

WebhookController

  • Esse arquivo é a porta de entrada de todos os eventos do webhook, importante frisar que se for trabalhar mais de um meio de pagamento, é necessário criar um outro controller. Divida os controllers por contextos/responsabilidades.

WEBHOOK_EVENTS

  • Esse arquivo é onde você irá mapear todos os eventos que irá usar de um determinado provider, exemplo: PAGARME_WEBHOOK_EVENTS, ASAAS_WEBHOOK_EVENTS, PAGSEGURO_WEBHOOK_EVENTS

WebhookHandler

  • A classe abstrata desse arquivo deverá ser implementada por todas as futuras classes que manipularão os eventos de webhooks (PS: sinta-se à vontade para trocar o nome), exemplo:
export class PagarmeWebhookPaymentConfirmed implements WebhookHandler { // code here }
export class PagseguroWebhookPaymentConfirmed implements WebhookHandler { // code here }
export class AsaasPagseguroWebhookPaymentConfirmed implements WebhookHandler { // code here }

WebhookOrigin

  • Essa classe que irá mapear os eventos de webhooks e chamar a classe correta para manipular algum evento

WebhookPayload

  • Essa classe acabei deixando de bônus, caso você trabalhe com um meio de pagamento que padronize a estrutura dos dados você pode utilizá-la sem problemas, exemplo de um objeto padronizado:
{
  "event": "PAYMENT_CONFIRMED",
  "payload": { // props of event here }
}

Exemplo de um objeto não padronizado

{
  "event": "PAYMENT_CONFIRMED",
  "payment": { // props of event here }
}

{
  "event": "INVOICE_CREATED",
  "invoice": { // props of event here }
}

Dessa forma fica mais complexo ter um objeto padronizado e usar essa classe, mas fique à vontade para desenvolver e abrir um PR. <3

Webhook

  • Esse arquivo é a espinha dorsal pra fazer a "mágica" de receber os eventos, mapear e chamar a classe responsável por lidar com o evento.
  • Aqui basicamente lidamos com o construtor das classes de manipulação de eventos e criamos um decorator chamado @Webhook(EVENT_NAME) onde você irá colocar o nome do evento que a classe vai trabalhar em cima.
  • Também construimos um array em memória contendo o seguinte par de informações: o nome do evento e o construtor da classe.
  • Como eventos são processos assíncronos, no controller nós recebemos toda a informação do evento e cabe a você mapear exatamente o que precisa usar, já executamos todos de uma vez e cada um fazendo o que precisa fazer.
  • No controller também já é feito o mapeamento de localizar a classe handler que vai executar o evento e já faz o dispatch dessa classe.



IMPORTANTE

  • Importante dizer que essa estrutura pode ser usada em projetos feito do zero (from scratch) ou também ser colocado dentro de um projeto feito com Nest.
  • A pasta dependency-injection é a injeção de dependência desse projeto mas pode ser adaptado pra usar em qualquer lugar e, obviamente, precisa ser adaptado no restante do projeto também.