Salve, Deus, beleza? Continuamos essa saga aqui no domínio do Ruin Design. Agora nós vamos ver um outro artifício poderoso desses domínios de eventos, que é o tão famoso Event Sourcing. A gente consegue fazer um histórico de tudo o que está acontecendo no nosso contexto e nós vamos ter uma série de benefícios nisso tá imagine que eu tenho um banco de dados que armazenem todo histórico de eventos sequencialmente ele todo ordenado então eu posso fazer uma auditoria saber quem fez o que dentro do sistema e até mesmo fazer um replay dos fatos. Pegando o caso de uma conta bancária, eu posso medir o saldo de uma conta bancária em uma determinada data, fazendo a execução dos eventos em ordem até chegar ali naquela data que eu quero. Então, nós podemos fazer aqui um armazenamento de eventos. Ele é incluído ali no Unit of Work e vai ser bem simples para a gente montar esse event sourcing. Eu já criei aqui, para ser mais fácil que a gente faça essa criação, essa coisa toda durante a aula. Então, nós vamos ter aqui uma entidade que vai armazenar esses eventos. Nós vamos ter o ID ali, que é um UID do evento em si. O BORIC vai conter todos os dados do evento, nesse caso a gente vai serializar ali para um JSON a data que ocorreu aquele evento ali. Isso aqui serve para ordenar, apesar que a gente vai ter a data dentro do Borrow também, mas aqui serve para poder fazer carries mais facilmente. E qual é o tipo que é o próprio evento que aconteceu. Então, a gente vai criar esse StoredEvent a partir de um evento de domínio. Aí serializa o Bory, pega o nome da classe, joga ali no typeName e qual é a data que ocorreu, a própria data aqui do evento de domínio e tem a serialização dele, bem simples. Aí nós temos aquela mesma situação de ter um repositório, para ele, mas aqui no caso são métodos comuns que a gente pode ter, além do próprio Edge, eu posso querer pesquisar uma leva de eventos no intervalo de um ID, de um evento até outro evento, e pesquisar a partir de um ponto. Então, eu já fiz essa implementação aqui, tudo com o microRM, tá? Fica aí para vocês também. Nós temos aqui o tipo de dado que eu tenho, que até o import está errado, foi até bom que eu vi. Deixa eu fazer o import no lugar correto aqui. A mesma situação ali de criar a nossa chave primária. E aqui temos o esquema dele com o id, o bory, type name, que é um string com 255, o bory é um json, e a data que ocorreu é um DATE. Maravilha. Então a gente vai ter que fazer aqui o seguinte. Dentro aqui do microRM config, eu vou ter que adicionar também o STORED EVENT SCHEMA. Eu tenho, inclusive, até que criar essa tabela eu não tenho ela ainda mas a gente roda aquele comando lá do microRM e vai criar e agora a gente vai fazer dentro, pode ser dentro do do domain events aqui do nosso módulo eu vou chamar um import com micro o rm module for feature e eu vou passar aqui o store event. Stored event, na verdade. É sempre no evento armazenado. Eu preciso também fazer o registro do repositório, então vamos abrir aqui um novo carinha. Eu vou registrar o iStoredEventRepository, que vai usar uma factory recebe ali o em e a gente vai fazer um new storage event mysql repository passando o em e tem o inject do do EntityManager. Show de bola. Aí eu posso pegar a mesma estratégia que a gente fez lá no módulo de eventos, eu posso fazer aqui, quando esse módulo iniciar, ele vai exigir aqui que eu implemente... porque que ele tá... ele não apareceu ali para mim, a gente faz na mão. Então, eu vou colocar um async aqui, se bem que eu acho que o async nem vai precisar. No construtor, a gente vai receber aqui aquele domain event manager. E aí, o que eu quero? Eu quero registrar todos os eventos. Então, na hora que eu faço ali o register, eu ia trabalhar com aquele event emirer lá atrás, foi legal, porque eu posso colocar aqui um asterisco, então a gente recebe todo tipo de evento, não interessa. Eu sei que vai ser um idomain event, e aqui eu chamo o meu repositório. Então nesse caso aqui, eu posso pegar o repositório Eu poderia pegar ele aqui dentro com o module ref Seria interessante pegar com o module ref Vamos pegar aqui o module ref This module-hef resolve I start event repository Aí tem um await aqui, então eu vou ter que ter um await aqui também Aí eu pego aqui o meu repositório e faço um add. Pronto. Quem que vai armazenar isso? Vai ser o commit lá dos application services. É somente isso? É. Mas é claro que a gente já fez a parte aqui do story event é como se ele fosse um domínio auxiliar aqui de suporte na nossa aplicação beleza agora eu quero desativar aqui event não quero mais rodar esse cara, só quero rodar aqui. Ele chiou com alguma coisa que eu não tenho metadados para... Na verdade aqui tem que ser o esquema, né? Que não é o storedEvent. Deixa eu rodar aqui de novo. Ele está chiando aqui comigo que não conseguiu ainda. Lá no eventos module module, a gente tá usando os esquemas. É isso mesmo, tá certo. Aqui eu tenho meu esquema. Classe aqui tá certinho. Na verdade o que eu tô fazendo de errado aqui é que eu tenho que chegar lá no application, no app module, né? E eu tenho que acrescentar na verdade aqui em database. Aqui também ficam todos, né? Então aqui é o stored event schema. Maravilha. Então, o que a gente vai fazer agora? Qualquer teste de criação de qualquer coisa, vamos fazer aqui. Ver se o get está funcionando. Só que infelizmente vou ter que fazer uma coisa aqui que é matar o banco de dados, não tem jeito. Vou ter que fazer um fresh ali, não tem que fazer. Então não vou ter mais nada lá no meu banco, mas não tem problema. Não tem nenhum partner. Agora na hora que eu criar, vamos ver o que aconteceu aqui. Eu adicionei a franquia, a tabela não existe, peraí. Então, eu adicionei aqui o meu esquema. Vamos dar uma olhadinha no banco de dados? Exec, mais SQL Bash. Que era para ele ter criado. useEventsShowTables. Ele não criou a tabela. Ah, já sei. A gente vai ter que fazer uma mudança aqui, porque agora ele não está mais dentro da source, porque ele está dentro de apps, aí barra mba.ddd.vendo.ingresso, barra source, aí vai lá o nosso... mba.ddd.vendo.ingresso.source. Aí vai lá o nosso arquivo. Até demorou mais um pouquinho, mas vamos garantir que está ok. Agora sim. Maravilha. Vamos lá. Tem que rodar antes aqui a aplicação. Então, npm vai estar de dev. Aí agora, vamos ver aqui partners de novo. Eu vou criar. Beleza, criou. Eu não tenho nenhuma API para poder fazer a consulta, a gente vai fazer em nível de banco de dados. Vamos fazer aqui um select, asterisco from, e start event. E foi armazenado lá. Isso aqui foi adicionado ali no nosso combo do Unit of Work. Então, tem o ID, tem a data aqui que foi feita, e o JSON além do type. Então, aqui nós temos o histórico dos eventos permitindo auditoria. A gente sabe o que está acontecendo, tudo vai ficar registrado. Eu posso acrescentar aqui também, se eu quiser, adicionar outras informações pertinentes, como de usuário, IP ou algo assim, eu posso fazer. E a gente consegue fazer o replay de um agregado. Olha só, eu tenho esse agregado aqui que foi armazenado em um ID tal, né? Então, eu posso pegar todos os eventos ao longo de um tempo que o ID do agregado seja esse aqui e eu vou processando, eu vou remontando o meu agregado, passando ali as informações, colocando dentro do agregado, posso utilizar os comandos também que estão ali dentro, e aí em um determinado momento eu tenho ali aquele agregado como ele estava naquela data. como ele estava naquela data. É muito ruim às vezes a gente trabalhar da forma que a gente trabalha, porque toda vez que a gente atualiza uma informação, ela é sobrescrita pela anterior. Então, a gente não sabe, não tem histórico. Então, isso aqui é uma forma... Os eventos são poderosos. Eles permitem que a gente faça um monte de coisas. É aquela história que o Vernon fala no livro. Uma vez que você trabalha com eventos de domínio, você não vai querer mais ficar sem. Porque você tem muita informação. Você consegue extrair muitas coisas. Tem muitos recursos. Fora a integração entre os outros nossos contextos. Show de bola, pessoal. Então, vamos continuar na nossa saga, é isso aí e até a próxima!