Domain Notification em NodeJS 🚀
Tags: javascript, node, programming, ddd
Published: 2023-02-22 01:23:02

## Introdução
Uma das responsabilidades do domínio de uma aplicação é garantir que os dados que a aplicação manipula estejam em um estado válido. No entanto, há casos em que os dados não estão em um estado válido, e o domínio precisa notificar o usuário sobre esses problemas. A notificação do usuário pode ser feita por meio de exceções ou erros, mas isso pode prejudicar a experiência do usuário e a confiabilidade do sistema. Uma alternativa é usar o padrão de Domain Notification para notificar o usuário sobre problemas em seus dados.

<img width="100%" style="width:100%" src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExMGZjZWFmM2E5Yjg3MTYzMGRmMGYxM2I1OGIxOTA5NDVmOTg3ZWU0YiZjdD1n/KI5iaLqXlPrYvnZgcW/giphy.gif">


O padrão de Domain Notification permite que a aplicação capture todos os problemas em seus dados e apresente-os ao usuário de uma maneira amigável. Ele é usado para notificar o usuário sobre problemas de validação, erros de negócio, etc. Neste artigo, discutiremos como implementar o padrão de Domain Notification em NodeJS usando o pacote flunt-js.

## O que é o flunt-js?
Flunt-js é uma biblioteca criada por min para validação de dados em JavaScript. Ele oferece uma abordagem simples e intuitiva para validar objetos. O flunt-js é inspirado no Flunt para .NET do André Baltieri e é compatível com o ES6 e o TypeScript ( Irei trabalhar na implementação para suportar 100% sem ter que sinalizar no arquivo para permitir js).

## Implementação
Para implementar o padrão de Domain Notification, você precisa criar uma classe que encapsule a lógica de validação e notificação. Essa classe será responsável por notificar o usuário sobre quaisquer problemas em seus dados.

Vamos criar uma entidade de exemplo User que possui as seguintes propriedades: nome, email, senha e cpf. Vamos usar o flunt-js para validar as propriedades de User e notificar o usuário sobre quaisquer problemas.

Primeiro, precisamos instalar a biblioteca:

```
npm install flunt-js
```
Usando o FluntJS e criando um entidade com validações

```js
const { Notifiable, Contract } = require('flunt-js');

class User extends Notifiable {
  constructor(nome, email, senha, cpf) {
    super();

    this.nome = nome;
    this.email = email;
    this.senha = senha;
    this.cpf = cpf;
    this.dataCadastro = new Date();

    super.AddNotifications(
      new Contract()
        .isEmail(email, 'O email informado é inválido.')
        .hasMaxLen(nome, 50, 'O nome deve ter no máximo 50 caracteres.')
        .hasMinLen(senha, 6, 'A senha deve ter no mínimo 6 caracteres.')
        .isFixedLen(cpf, 11, 'O CPF informado é inválido.')
    );

  }
}

const usuario = new User('John Doe', 'johndoe@example.com', '123456', '12345678901');

// Executa a validação e imprime as mensagens de erro, se houver
if (!usuario.isValid()) {
  console.log(usuario.getMessages());
} else {
  console.log('Usuário válido.');
}

```

Nesse código, a classe User encapsula a lógica de validação e notificação usando o flunt-js. A função validar() usa o flunt-js para validar as propriedades de User e notificar o usuário sobre quaisquer problemas.

O flunt-js suporta vários tipos de validação, incluindo validação de comprimento máximo (hasMaxLen), validação de comprimento mínimo (hasMinLen), validação de formato de e-mail (isEmail), validação de valor fixo (isFixedLen), etc. É possível personalizar as mensagens de erro retornadas por cada validação.

```js

const usuario = new User('John Doe', 'johndoe@example.com', '123', '1234564233432478901');

// Executa a validação e imprime as mensagens de erro, se houver
if (!usuario.isValid()) {
  console.log(usuario.getMessages());
} else {
  // não entra aqui pois os dados são inválidos
  console.log('Usuário válido.');
}

```

Nesse código, criamos um novo usuário com dados inválidos e validamos esses dados. Se a validação falhar, a função notifications retornará uma lista de mensagens de erro. Podemos usar essa lista para notificar o usuário sobre quaisquer problemas.

Agora que temos nossa entidade User, podemos usá-la para validar os dados do usuário em uma rota POST. Por exemplo, se estivermos criando um novo usuário em nossa aplicação, podemos fazer o seguinte:

```js
const express = require('express');
const User = require('./User');

const app = express();
app.use(express.json());

app.post('/users', (req, res) => {
  const { name, email, password } = req.body;

  const user = new User(name, email, password);
  
  if (user.isValid()) {
    // retorna a lista de notificações ( caso queria somente as mensagens pode usar o getMessages() )
    return res.status(400).json(user.notifications);
  }
  
  // Salvar usuário no banco de dados
});
```


## Conclusão
O padrão de Domain Notification é uma maneira de notificar o usuário sobre problemas em seus dados. Ele permite que a aplicação capture todos os problemas em seus dados e apresente-os ao usuário de uma maneira amigável.

Neste artigo, discutimos como implementar o padrão de Domain Notification em Node.js usando o pacote flunt-js. É uma biblioteca para validação de dados em JavaScript que oferece uma abordagem simples e intuitiva para validar objetos.

A validação usando o flunt-js ajuda a garantir que os dados estejam em um estado válido e notifica o usuário sobre quaisquer problemas. Usando a validação, podemos garantir que a aplicação está recebendo dados válidos e evitar problemas futuros.

<img width="100%" style="width:100%" src="https://media.giphy.com/media/czubJ08i7deuKGJE9A/giphy.gif">


## Referências
Flunt-js: https://github.com/jhonesgoncalves/flunt
Flunt: https://github.com/andrebaltieri/Flunt
Domain Notification: https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/ddd-oriented-microservice#domain-events-and-notifications