Salve, Deus, beleza? Continuando essa saga aqui no Domain Design. Agora que nós já entendemos os eventos de domínio, que eles servem aqui como acontecimento de algo ali no domínio, e eu tenho ouvintes que vão ser notificados desses eventos, eu posso enviar um e-mail, posso fazer qualquer coisa ali, até um outro processo de negócio, até mesmo desafogando coisas que a gente tem dentro do nosso Application Service. Agora vamos falar sobre os eventos de integração. Então, o evento de domínio só notifica o próprio contexto que eu estou, ou seja, a minha aplicação de eventos. Mas se tiver um outro subdomínio que precisa ser notificado por algo que acontece aqui no nosso subdomínio, então a gente vai chamar isso de evento de integração, ou integration events. A gente poderia encaixar isso aqui no nosso sistema com aquela situação lá que quando o usuário faz a reserva, tem que enviar um e-mail para ele, e a aplicação de envio de e-mails é um outro subdomínio. Então tem que ser via evento de integração. Então, o que a gente vai acabar fazendo aqui? Eu não vou gerar uma outra aplicação para tornar até mais difícil a execução disso. Eu posso gerar uma outra aplicação aqui dentro dessa própria do Nest e rodar essas duas aplicações. Então, eu vou parar aqui o meu Nest, vou rodar o npx nest generate app. Isso aqui vai gerar uma nova aplicação e vou chamar ela de emails. O que ele vai acabar fazendo aqui agora? A nossa estrutura de pastas vai mudar um pouquinho, porque eu vou ter e-mails e aquela aplicação principal foi movida para essa pastinha aqui, MBA e DDD, venda e ingresso. Eu nem sei se quebrou, porque às vezes algum importe que a gente está fazendo aqui, principalmente do microRM, se aconteceu alguma questão, mas a gente faz essa verificação. Então, eu tenho aqui o meu outro contexto com a minha alta linguagem ubíqua, com as minhas modelagens e etc. E esse cara aqui vai receber essa... esse evento de integração. E nesse caso, a gente vai trabalhar de modo assíncrono, para a gente ficar exposto, de fato, ao que é recomendado, que subdomínios se comuniquem de forma assíncrona para diminuir esse acoplamento entre eles e a gente não carregar esse processo de negócio inteiro. Às vezes, eu posso estar trabalhando com o DDD, fazer essa separação desses subdomínios, e mesmo assim eu estou ali dentro da mesma aplicação, fiz a separação por módulos, e a comunicação mesmo assim pode ser assíncrona. Como pode ser assíncrona? Mas quando a gente tem a comunicação assíncrona, eu tenho muito mais capacidade de lidar com o meu processo de negócio, porque eu não tenho que ficar esperando que a requisição HTTP para o subdomínio de e-mails termine, para eu dar a resposta para o usuário. A gente vai publicar em uma mensageria para isso acontecer. Então, dado que a gente tenha esse e-mail aqui, o que nós vamos fazer agora na nossa aplicação? No core, aqui dentro de domain, eu vou criar mais uma pastinha que eu vou chamar de integration event. Mas eu não poderia usar os próprios eventos de domínio? A gente até pode, mas um evento de integração, ele não tem a mesma pegada de um evento de domínio, porque a gente pode querer mandar outras informações, acrescentar ou até diminuir, dependendo da situação. Então, vamos pegar aqui o caso do partner que nós estamos trabalhando, que é bem simples. Eu vou chamar ele de partner-created-intEvent. Deixa bem claro que isso aqui é um evento de integração. Então, o evento de integração vai ser uma classe com um evento de domínio. A gente vai acrescentar aqui um integration event. Vou deixar um nome bem grande para isso aqui ficar claro. E é interessante também que a gente tenha uma abstração para poder trabalhar com esses eventos de integração para ter, de fato, um padrão. Então, aqui no common, nós podemos criar também uma abstração para esses caras. Eu vou chamar isso de integration-event.ts Então, nesse cara, nós vamos ter aqui uma interface que é o I integration event que é o I integration event e a gente vai querer colocar aqui imagina só estou enviando isso para um outro subdomínio a gente tem que ser mais formal agora na hora de publicar esse evento seria interessante que a gente tivesse o event name separado do próprio payload do evento, que são os dados. Os próprios dados que eu queira enviar. Então, eu quero deixar isso aqui de forma genérica. Eu posso usar o generic do TypeScript e falar assim, olha, o t vai ser exatamente o que a gente vai enviar ali no payload, e eu não sou obrigado a definir isso, então eu vou deixar ali o T como valor padrão com o N. Tem a versão também do evento, isso aqui é importante porque às vezes o nosso ouvinte ele não está preparado para poder trabalhar com essa versão. Então isso aqui também ajuda a gente a manter a compatibilidade das coisas e a data que ocorreu. Ocurrent on vai ser um tipo date. Então, esse aqui é o nosso padrão. Beleza, dado esse padrão, então vamos voltar para cá. Eu tenho que implementar o meu integration event e a gente vai montá-lo aqui. Deixa eu pensar como que a gente vai fazer. Eu vou colocar as informações aqui em cima, event name string, o payload, que vai ser any versão do evento e o code on. Então, no construtor, eu posso receber aqui um domain event, que é o partner created, porque esse evento de integração é gerado a partir de um evento de domínio que aconteceu na nossa aplicação. Então, o event name vai ser exatamente igual ao próprio nome da classe. Então, vou pegar aqui o próprio nome da classe, ponto name. Isso aqui é bom, porque o nosso consumidor vai saber qual é o evento que aconteceu, quando ele ocorreu. Aí no payload, nós vamos decidir quais dados que nós vamos ter. Eu quero, obviamente, o ID do agregado, mas aqui eu não vou enviar o objeto de valor. Aqui a gente vai enviar as informações de modo mais puro possível, e o nome do parta. Então a gente coloca aqui todas as informações, sem o belo, que não tem objeto de valor. A versão do evento pode ser 1, que na verdade é definido. Ele vai chiar aqui comigo, por algum motivo. Se ele chiar a gente define aqui dentro. E a data que ocorreu vai ser a própria data do evento aqui mesmo. Aqui também ele está falando que... Coloquei como number ali, vou definir aqui dentro, versão é 1 também, beleza. Melhor que eu tenho que tirar na verdade só o igual. Então está aqui o meu evento de integração. Agora, como que eu faço para poder fazer o envio desse evento? Porque esse evento, se eu criei ele, tem que ser enviado quando o PartnerCreated aconteceu. Nós vamos registrar lá no Events Module, porque tem relação com esse módulo, aqui que a gente está fazendo toda a junção do quebra-cabeça, a gente vai fazer também o registro com o Event Manager. Uma vez que o Partner Created aconteceu, a gente vai instanciar o nosso evento de integração. Mas aí que vem a questão, vem a pergunta aqui no final da aula. A gente publica direto na mensageria, no sistema de mensagens que a gente vai usar, para que o outro subdomínio leia, ou eu poderia ter alguma forma mais resiliente de fazer isso. A gente tem que fazer essa pergunta, se essa publicação não acontecer, eu vou ficar tentando aqui e não devolver a resposta para o usuário, será que a gente deveria fazer a publicação direta, já, quando o evento acontecer, ou poderia também publicar na mensageria mais tarde? A gente vai responder essa pergunta na próxima aula que a gente vai fazer essa montagem. Então, pessoal, é isso aí e até a próxima.