# CQRS
Hoje temos os bancos todos separados, e precisavamos unificar eles para fazer joins.
Não temos campos customizados na pesquisa avançada. Com o CQRS vamos ter estes campos.
O Report consome o CQRS, para montarmos consultas com joins é utilizado o CQRS por baixo para montar as consultas.
O importação CSV vai consumir o CQRS.
O elasticSearch é um banco não relacional, que trabalha com indice e documentos, o **indice** é como se fosse as tabelas e os **documentos** são como se fosse as colunas.
Para acessar utilizamos o serviço do PRESTO para fazer a conexão e as consultas no elasticSearch.
### Consultando no elasticSearch
A consulta é feita dentro do container do PRESTO por linha de comando.
**Comandos:**
presto --catalog elasticsearch --schema default
show tables;
## Mensageria
A mensageria utiliza o serviço HERMOD.
A amazom aws (SNS e SQS) é o serviço que utilizamos para publicar e consumir eventos.
**SNS**
Topics:
Utilizamos o qabtb_service
Topicos são aonde nós publicamos os eventos (mensagem).
Quando um serviço utiliza um topico?
Quando é necessario publicar mensagens.
**SQS**
São as filas, fica monitorando os topicos.
Consigo ver quais tópicos as filas consomem.
**Entidades trabalhadas pelo CQRS são:**
* CUSTOMER
* LEAD
* CONTACT
* SALES ORDER
* PRODUCT
* ACTIVITY
* OPPORTUNITY
* OPPORTUNITY_ITEMS (não pronta)
* BTB (precisa somente para montar o contrato)
> O CQRS se basea totalmente no BTB como um contrato
> Meta-object são as tabelas (Indice)
> Meta-atribute são as colunas (Documentos)
> Customization-lake são os registros (Somente dos dados customizados)
### Exemplo prático:
Eu crio uma oportunidade e salvo (O registro e salvo na tabela opportunity);
A mesma ação de salvar acontece na tabela de message_broke_event (Isso se chama um evento) (sempre se lembre desta tabela)
Ela é publicada dentro do tópico do opportunity no SNS
E ai os serviços vão consumir conforme as filas (SQS), o que importa para nós é a fila do bragi.
### Criando um tópico (SNS) e uma fila (SQS)
Para criar um Topic (SNS)
Procure por SNS nos Services

Clique em Topic na sidebar a esquerda e em Create topic para cadastrar um tópico

Marque a opção Standard preencha o Name conforme o padrão

Depois clique em Create topic

Após criar o Topic copie o ARN

Pronto agora o Topic foi criado, então vamos cadastar uma fila para ele:
Para isto abra uma nova aba, mas mantenha a aba do Topic aberta, com a AWS e procure nos Services por SQS

Clique no botão Create queue

Marque a opção Standard e preencha o campo Name conforme o padrão

Clique em Create queue para finalizar o cadastro da fila

Após ter cadastrado a fila, vamos escrever ela no Topic do SNS: Procure por ela pesquisando pelo nome no campo de pesquisa;
Quando encontrar, selecione ela clicando no radio button;
Clique na select Actions que fica ao lado do botão Create queue;
Clique na opção Subscribe to Amazon SNS topic;

Agora na tela de Subscribe to Amazon SNS topic:
Clique na select Specify an Amazon SNS topic available for this queue;
Selecione a opção Enter Amazon SNS topic ARN;

Vai abrir uma caixa de texto An Amazon SNS topic that can send notifications to an Amazon SQS queue:
Cole o ARN copiado após a criação do Topic;
Clique no botão Save;

Após salvar a inscrição da fila no topic, vamos rolar a pagina para baixo até aparecer varias colunas com opções:
Clique na opção SNS subscriptions;
Marque o Topic que você criou anteriormente;
Clique em View SNS;

Vamos ser redirecionados para o SNS em outra aba:
Nela vamos clicar em Edit;

Após clicar em Edit na proxima tela vamos marcar a opção Enable raw message delivery;

Depois é só clicar em Save changes

---
Para poder-mos monitorar as messages de uma fila podemos marcar a opção **Poll for messages** dentro da fila:
Para isto edite uma fila (SQS / QUEUE)

No bloco Receive message marque a opção **Poll for message**

## WarmUp
Serviço criado para atualizar bases que já contenha dados.
**Como fazer o processo:**
* Vamos no rancher
* Em Infraestrutura
* Dar um upgrade no elasticSearch (Caso não tenha mais de um tenant)
* Dar upgrade no PRESTO
* Dar um drop no tenant na base do BRAGI
* Criar o tenant novamente
* Vou na AWS no SQS nas filas QUEUES do qabtb_service
* Marco a fila que tem mensagem e dou um PURGE para deletar as mensagem da fila (!Atenção para não deletar as mensagens das filas que outras pessoas estão usando!)
* No caso de não poder deletar a fila, entrar dentro da fila, clico em send and receive messages, e clico em Poss for messages. Vou clicar na mensagem e ver se é do meu tenant, ai se for eu deleto.
* Após todo o processo de remoção das filas/message, rodar as migrations (flyway)
* Dar upgrade no container do BRAGI (Para iniciar o warmUp)
* Dar um view log para ver o processo
Existe um comando no postman para limpar todos os dados de um tenant no elastiSerch sem precisar reiniciar o container, caso aja mais de um tenant cadastrado no elasticSearch:
`<url>:9200/tenant_3_*`
> Não há suporte para update de um meta_object, portanto da erro no processamento do message-broker.
> Existe um parametro para configurar o numero de tentativas até falhar.
Para testar a collection (Ex: AWS - SNS/SQS (Customer) CR) onde valida o SQS e SNS
Foi criado uma stack QA-GoAWS no ambiente BTB
Foi criado databases separadas dos serviços que utilizam mensageria. Ex: opportunityaws
Esta utilizando o tenant_3
Antes de rodar a collection:
Preciso entrar na stack QA-GoAWS
Dar upgrated no container postgrest/postgrest:latest
Editar o parametro PGRST_DB_URI setando o banco do serviço que eu vou testar:
