DEV Community

Cover image for Como criar micro serviços - Nível fácil parte 3
Jean Carlos Molossi
Jean Carlos Molossi

Posted on • Originally published at jeanmolossi.com.br

Como criar micro serviços - Nível fácil parte 3

Como já dito nos artigos anteriores, criar um sistema baseado em micro serviços não é difícil. Vamos passo a passo e ao final dessa série, você verá que de fato é simples.

Users API

Aqui, vamos criar uma simples API Rest Http. Isso não deve ser um mistério. Ter uma Controller com as rotas, uma camada de Services, conexão com base de dados, tudo muito simples.

Domínio

Vamos iniciar pela camada de domínio. Isso vai garantir que foquemos em regras de negócio e depois nos preocupamos em implementar as rotas e regras de aplicação, que não são pertinentes ao domínio.

Primeiro vamos iniciar nosso projeto.


mkdir users-api && cd users-api

yarn init -y

Enter fullscreen mode Exit fullscreen mode

Isso já deve gerar nossa pasta e iniciar o package.json. Vamos configurar o typescript agora, no terminal execute:


yarn add -D typescript && \

yarn tsc --init

Enter fullscreen mode Exit fullscreen mode

Isso resolve nossa configuração inicial do typescript. Agora vamos começar com nosso domínio.


mkdir domain && touch domain/user.ts

Enter fullscreen mode Exit fullscreen mode

Com isso vamos ter nossa entidade de user. Antes de começar com a construção do nosso user vamos configurar o jest como nosso runtime para testes.

Execute:


yarn add -D jest @types/jest ts-jest ts-node

Enter fullscreen mode Exit fullscreen mode

Após o comando acima, teremos o jest instalado, agora vamos configurá-lo:


yarn jest --init

Enter fullscreen mode Exit fullscreen mode

Com esse comando o jest inicia o processo de configuração, com isso seu terminal fará algumas perguntas. Vamos às respostas:

  • ✔ Would you like to use Jest when running “test” script in “package.json”? (y/N)
    • Pressione “n”
  • ✔ Would you like to use Typescript for the configuration file? (y/N)
    • Pressione “y”
  • ✔ Choose the test environment that will be used for testing
    • Selecione “node”
  • ✔ Do you want Jest to add coverage reports? (y/N)
    • Pressione “y”
  • ✔ Which provider should be used to instrument code for coverage?
    • Selecione “v8”
  • ✔ Automatically clear mock calls, instances, contexts and results before every test? (y/N)
    • Pressione “y”;

Agora você pode ver que foi criado um arquivo jest.config.ts. Esse é o arquivo de configuração do jest. Porém, você precisa adicionar uma última configuração:

// tsconfig.json

// ... Logo depois de export default

export default {

// ... Aqui abaixo.

  transform: {

    "^.+\\.tsx?$": "ts-jest",

  },

  // ...

Enter fullscreen mode Exit fullscreen mode

Vamos criar nosso primeiro teste para saber se está tudo correto.

Crie o arquivo user.spec.ts (ou execute touch domain/user.spec.ts) junto com o arquivo user.ts

Dentro do arquivo de teste (user.spec.ts) vamos digitar o seguinte código:


// user.spec.ts

describe("Domínio de usuário", () => {
  it("deve funcionar", function () {
    expect(true).toBe(true);
  });
});

Enter fullscreen mode Exit fullscreen mode

Antes de testar, vamos ajustar nosso package.json. Vamos adicionar um script. O package.json deve ficar assim:

// package.json

{
  "name": "users-api",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "start": "node index.js",
    "test": "jest"
  },
  "devDependencies": {
    "@types/jest": "^28.1.3",
    "jest": "^28.1.1",
    "ts-jest": "^28.0.5",
    "ts-node": "^10.8.1",
    "typescript": "^4.7.4"
  }
}

Enter fullscreen mode Exit fullscreen mode

Note que adicionamos uma chave scripts e nela temos dois (2) scripts. Um para iniciar a aplicação e outro para testar.

Agora no terminal, executamos:


yarn test

Enter fullscreen mode Exit fullscreen mode

Esperamos que tudo dê certo. Se aparecer 1 passed em verde, significa que tudo está bem configurado.

A partir de agora, vou explicar o que faremos e o resultado.

Vamos relembrar. Nossas regras de negócio nos dizem que:

Todo usuário deve fornecer um e-mail e uma senha para poder se cadastrar.
Toda atualização do usuário registra a data em que ocorreu.
Sabendo disso, nosso teste de user deve ficar assim:

// user.spec.ts

import { User } from "./user";

describe("Domínio de usuário", () => {
    it("deve fornecer um e-mail e senha em User", function () {
        expect(
            new User(
                "id-fake",
                "email-fake",
                "password-fake",
                "created_at-fake",
                "updated_at-fake"
            )
        ).toBeTruthy();
    });

    it("deve dar erro se não fornecer e-mail ou senha em User", function () {
        expect(() => {
            new User(
                "id-fake",
                // Email vazio
                "",
                "password-fake",
                "created_at-fake",
                "updated_at-fake"
            );
        }).toThrowError("É obrigatório informar um e-mail");

        expect(() => {
            new User(
                "id-fake",
                "email-fake",
                // Senha vazia
                "",
                "created_at-fake",
                "updated_at-fake"
            );
        }).toThrowError("É obrigatório informar uma senha");
    });
});
Enter fullscreen mode Exit fullscreen mode

Se você tentar executar os testes yarn test deve falhar. Mas agora vamos criar nossa classe de usuário para resolver isso.

// user.ts
export class User {
    private _user_id: string;
    private _email: string;
    private _password: string;
    private _created_at: string;
    private _updated_at: string;

    constructor(
        user_id: string,
        email: string,
        password: string,
        created_at: string,
        updated_at: string
    ) {
        this._user_id = user_id;
        this._email = email;
        this._password = password;
        this._created_at = created_at;
        this._updated_at = updated_at;

        this.validate();
    }

    private validate() {
        if (!this._email) {
            throw new Error("É obrigatório informar um e-mail");
        }

        if (!this._password) {
            throw new Error("É obrigatório informar uma senha");
        }
    }
}

Enter fullscreen mode Exit fullscreen mode

A partir de agora, acompanhe por vídeo. Este artigo ficará imenso caso eu explique tudo. O essencial já está aqui. O que terá no vídeo é a prática do desenvolvimento e insigths.

Acompanhe pelo vídeo

Em breve

Discussion (0)