Como criar micro serviços - Nível fácil parte 3
Tags: webdev, beginners, programming, tutorial
Published: 2022-06-29 04:06:58

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.

```shell

mkdir users-api && cd users-api

yarn init -y

```

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

```shell

yarn add -D typescript && \

yarn tsc --init

```

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

```shell

mkdir domain && touch domain/user.ts

```

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:

```shell

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

```

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

```shell

yarn jest --init

```

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:

```ts
// tsconfig.json

// ... Logo depois de export default

export default {

// ... Aqui abaixo.

  transform: {

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

  },

  // ...

```

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:

```ts

// user.spec.ts

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

```

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

```json
// 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"
  }
}

```

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:

```shell

yarn test

```

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:

```ts
// 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");
	});
});
```

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

```ts
// 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");
		}
	}
}

```

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**