# Boas práticas ao validar mensagens em um pipeline consumer

Ao gerenciar integrações que exigem segregação, dividir a integração em múltiplos pipelines pode melhorar a clareza e eficiência. A seguir, veja um exemplo de cenário e algumas práticas recomendadas.

## **Cenário de exemplo: Processamento de pedidos de pagamento em um e-commerce**

Imagine uma integração que processa pedidos de um e-commerce. Para gerenciar eficientemente um grande volume de pedidos, você decide dividir a integração em dois pipelines:

* **Pipeline A:** Recupera os pedidos de uma API.
* **Pipeline B (consumer):** Recebe os dados dos produtos extraídos dos pedidos e os envia para outra API.

1. ### **Uso de Eventos para a segregação do processo**

Para integrar processos que demandam segregação, use **Eventos** para delegar tarefas específicas a outro pipeline (o consumer).

Nesse contexto, é essencial:

* Definir precisamente os dados que o consumidor receberá.
* Estabelecer um contrato claro entre os processos.

Isso assegura que a mensagem transmitida seja precisa, concisa e válida, facilitando a comunicação e reduzindo possíveis erros entre os dois processos.

2. ### **Otimização dos dados enviados ao consumer**

No **Pipeline A**, a API de pedidos retorna o seguinte JSON:

```json
{
  "status": 200,
  "body": {
    "numPedido": "001",
    "produtos": [
      {
        "codigo": "123",
        "nome": "Produto A"
      },
      {
        "codigo": "456",
        "nome": "Produto B"
      }
    ],
    "cliente": {
      "nome": "Cliente Exemplo",
      "cpf": "123.456.789-10",
      "email": "cliente@email.com",
      "enderecos": {
        "logradouro": "Rua de Exemplo",
        "numero": "10",
        "cep": "01010-10"
      }
    }
  },
  "headers": {
    "Cache-Control": "no-cache,must-revalidate,max-age=0,no-store,private",
    "Content-Type": "application/json;charset=UTF-8",
    "Date": "Wed, 01 Jul 2020 19:04:46 GMT",
    "Expires": "Thu, 01 Jan 1970 00:00:00 GMT",
    "Set-Cookie": "BrowserId=up7LXrwv46wesv5NEeg9ps_4AgB_",
    "Strict-Transport-Security": "max-age=31536000; includeSubDomains",
    "Transfer-Encoding": "chunked",
    "Vary": "Accept-Encoding",
    "X-B3-Sampled": "0",
    "X-B3-SpanId": "8c419a93i3bsi0=9d8e54316",
    "X-B3-TraceId": "8c419a9389gba9y54316",
    "X-Content-Type-Options": "nosniff",
    "X-ReadOnlyMode": "false",
    "X-XSS-Protection": "1; mode=block"
  }
}
```

Contudo, para o **Pipeline B**, apenas o array de "produtos" é necessário:

```json
{
  "produtos": [
    {
      "codigo": "123",
      "nome": "Produto A"
    },
    {
      "codigo": "456",
      "nome": "Produto B"
    }
  ]
}
```

Enviar o JSON completo para o **Pipeline B** incluiria dados desnecessários. Em vez disso, use um conector [**Transformer (JOLT)**](https://app.gitbook.com/s/SKBJ6ZiEWBU93x170HH4/connectors/tools/jolt-v2), [**JSON Generator**](https://app.gitbook.com/s/SKBJ6ZiEWBU93x170HH4/connectors/tools/json-generator), ou [**Event**](https://app.gitbook.com/s/SKBJ6ZiEWBU93x170HH4/connectors/queues-and-messaging/event-publisher) para processar o JSON e garantir que somente as informações essenciais de “produtos” sejam enviadas.

#### **Por que evitar o envio de payloads JSON completos?**

Enviar o JSON completo pode sobrecarregar o Pipeline B com dados irrelevantes, possivelmente incluindo centenas de linhas, quando apenas uma fração é necessária. Limitar a transferência de dados às informações essenciais melhora a eficiência, independemente do volume de dados.

Outros benefícios incluem:

* **Logs de execução:** Mensagens menores resultam em logs mais claros e fáceis de gerenciar.
* **Manutenção:** Dados simplificados facilitam a resolução de problemas e atualizações, especialmente quando pessoas diferentes estão envolvidas em manter a integração.

3. ### **Validação de dados e contratos**

Para uma validação de dados robusta, o **Pipeline B** pode usar:

* [**Conector Validator**](https://app.gitbook.com/s/SKBJ6ZiEWBU93x170HH4/connectors/tools/validator-v2)**:** Use um JSON Schema para definir precisamente o JSON esperado pelo consumer.
* [**Conector Choice**](https://app.gitbook.com/s/SKBJ6ZiEWBU93x170HH4/connectors/logic/choice)**:** Use JSONPath para validar elementos específicos na mensagem recebida. Por exemplo, expressões como `$.produtos` or `$.produtos[?(@.codigo && @.nome)]` garantem que somente dados válidos sejam processados.

Caso essas condições não sejam atendidas, um fluxo de erro será acionado, interrompendo o processo devido ao descumprimento do contrato especificado.
