bom pessoal eu falei um pouco com você sobre cqrs tá e eu criei um exemplo de código aqui extremamente simples tá só pra você ver como que você poderia trabalhar com cqrs tá um ponto importante aqui também pra vocês é que nesse caso eu estou trabalhando com eventos é do all right de mecanismo de sincronização o que significa que eu estou escrevendo eventos dual write, de mecanismo de sincronização. O que significa? Que eu estou escrevendo em dois bancos de dados diferentes, simultaneamente aqui dentro da minha própria aplicação, sem utilizar um mecanismo de sincronização externo. Então, o que acontece aqui? É uma aplicação em Go, depois eu deixo o repositório aqui para vocês verem, mas é algo muito simples. Eu não quero que você se prenda ao código fonte tá a porque muitas vezes você nem programa nessa linguagem mas eu quero deixar um pouco claro como as coisas aqui funciona tá a se você for ver aqui a parte interna da minha aplicação olha só que interessante eu tenho duas partes eu tenho duas camadas básicas aqui uma camada de comando que são intenções de usuário e eu tenho uma camada de consulta tá vamos aqui para a camada de comando na camada de comando aqui galera se você olhar eu tenho aqui uma área de domínio onde, por exemplo, eu tenho regras de negócio. Olha só, eu tenho um sistema de order, eu tenho produtos, eu tenho itens de produto, a minha order eu posso adicionar itens, eu consigo verificar se os itens são repetidos, eu consigo pegar o total onde eu tenho a minha regra de negócio de sair multiplicando a quantidade de itens que tem em cada cara. Então, se você perceber, aqui é um modelo simples de regras de negócio. Legal? Outra coisa interessante aqui é que eu tenho um repositório onde, por exemplo, eu gravo, sei lá a os dados num banco de dados legal simples assim eu tenho que buscar por idéia para garantir que eu não estou botando dado repetido e tudo mais mas o ponto aqui é que eu simplesmente gravo os dados no banco de dados pode ver aqui que eu não tenho nenhum método onde é um fai de all eu não tenho paginação eu não tenho nada baseado em leitura o que eu tenho de leitura que simplesmente é algo que eu preciso para poder gravar tá de forma geral é isso legal e aqui que é um ponto importante para você entender também, que aqui eu tenho um bendito comando. Então, o que esse meu comando faz? Eu tenho os dados de input, ou seja, eu tenho o nome e o preço que eu vou receber. E aqui, o que eu vou ter aqui, se você perceber? Eu tenho o meu comando, a minha classe, a minha estrutura de comandos aqui. Onde eu tenho um repositório, onde eu vou gravar os dados no banco de dados. E aqui eu tenho os eventos, e eu já vou falar desse evento para você. Então, o que eu faço aqui? Eu tenho um método chamado handle, que eu vou fazer o seguinte. Eu crio um novo produto e salvo esse produto no banco de dados se você perceber e aqui que eu quero que você preste atenção essa minha função esse meu método renda um aqui ele não retorna nada normalmente quando a gente trabalha na nossa aplicação o que a gente faz a gente cria algo e retorna o que a gente criou inclusive com o id aqui não eu só crio e acabou legal mas lembra que eu falei do do arraigar você o que eu posso fazer que quando eu gere essa minha transação aqui, eu dispare um evento para que eu grave, para que eu use esse evento para gravar no meu banco de dados de leitura. Então aqui, quando eu estou dando save, eu estou gravando num banco de dados de escrita. Mas o que eu posso fazer aqui, então? Eu tenho um evento, chamado Product Created Event, ou seja, é quando um produto é criado, eu seto o payload. O que é o payload? É o conteúdo do evento. O que vai ter nesse conteúdo? O ID do produto, o nome do produto e o preço do produto. Legal? Uma vez que eu preparei o meu evento aqui, eu vou dar um dispatch, D do produto, o nome do produto e o preço do produto. Legal? Uma vez que eu preparei o meu evento aqui, eu vou dar um dispatch. Ou seja, eu vou disparar esse evento aqui para o meu sistema. Legal? Agora, um ponto importante aqui é o seguinte. Quando eu disparar esse evento para o meu sistema, o que vai acontecer? Eu vou ter aqui handlers que vão cuidar da operação quando esse evento for disparado. Então, por exemplo, aqui eu tenho o meu Product Created Handler. O que significa? O meu Product Created Handler. O que significa? Que toda vez que um produto é criado e vai disparar um evento, essa função aqui é executada. O que esse cara faz aqui? Ele grava no MongoDB. Então, se você perceber, esse cara aqui está trabalhando com SQL puro em um banco relacional, mas quando um evento é disparado, ele também vai gravar em um banco de dados, nesse caso orientado a documentos. Então, ele vai pegar os dados do meu evento, transformar esse dado aqui de volta com ID, com nome e com preço, vai aqui, por exemplo, pegar minha collection no MongoDB e inserir esses dados no MongoDB. Agora, eu não sei se você percebeu, mas nesse momento aqui, o que está acontecendo? Eu fiz um comando, esse comando gravou no banco de dados de escrita e gerou um evento, o qual eu pude também gravar num banco de dados de leitura. E agora, eu tenho dois bancos de dados de diferentes tipos, de formas diferentes de leitura que eu vou conseguir trabalhar. Bacana? No próximo vídeo eu vou mostrar aqui para vocês a outra camada do nosso sistema, que é a camada de leitura. Lembrando que aqui eu estou na camada de comando, onde eu gravo os dados. Legal? E depois a gente vai falar agora sobre a camada de leitura. Vamos nessa.