AluraChallenges #2 ( Intro e Config )
Tags: alura, node, typescript, nestjs
Published: 2021-08-16 22:13:52

## Introdução

Nesta série, irei demonstrar a minha versão do desafio proposto no [Alura Challenges #2.](https://www.alura.com.br/challenges/back-end)

### O que é um Challenge da Alura?

> *"É uma forma de implementar o Challenge Based Learning que a Apple ajudou a criar. Um mecanismo onde você vai engajar em cima de um problema, para só depois investigar soluções com cursos, conteúdo e conversas; ou até mesmo com o conhecimento que você já possui! Finalmente vai agir e colocar seu projeto no ar. Tudo isso com você comentando e ajudando nos projetos de outros alunos e alunas."*

No que consiste esse desafio?
Ao longo de 4 semanas foram disponibilizados 1 painel por semana com os cards de funcionalidades que deveriam ser implementadas.



#### A minha versão 

Eu escolhi o framework [NestJs](https://nestjs.com/) para o desafio, que traz uma série de facilidades para o desenvolvimento, além de uma ótima arquitetura.



##### E como essa série vai funcionar?
A cada semanas, farei posts com as implementações realizadas, que deve seguir mais ou menos assim:

###### Semana 1:

* _API de Vídeos com rotas implementadas segundo o padrão REST;_
* _Validações feitas conforme as regras de negócio;_
* _Implementação de base de dados para persistência das informações;_
* _Testes das rotas GET, POST, PATCH e DELETE._

###### Semana 2:

* _Adicionar `categorias` e seus campos na base de dados;_
* _Rotas CRUD para `/categorias`;_
* _Incluir campo `categoriaId` no modelo `video`;_ 
* _Escrever os testes necessários._

###### Semana 3:

* _Paginação de videos_ 
* _Segurança para os recursos_

###### Semana 4:

* _Documentando a API com Swagger_
* _Integrando com o front-end_
* _Conclusão_


Hoje como "dia 0", mostrarei como vamos preparar e configurar tudo o que é necessário para iniciarmos esse projeto, go go go!


## Configurando o projeto

Para começarmos a brincadeira, precisamos instalar e configurar o nosso ambiente.

Vou utilizar como IDE o VSCode, que você pode baixar [aqui](https://code.visualstudio.com/).
Como linguagem de programação, vou utilizar o NodeJs (Typescript) na versão 14, [download aqui](https://nodejs.org/en/).

Após o download e instalação deles, vamos criar uma pasta chamada aluraChallenge2 e abri-la no VSCode. 
Nele, vamos abrir o terminal integrado
![Habilitando o terminal](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lsl4lf16qny8r4t2mo0b.png)
e digitar os comandos:
```bash
npm i -g @nestjs/cli
```
para instalar o CLI do Nest globalmente e

```bash
nest new alura-challenges-2
```
para criar o novo projeto Nest.
O CLI vai perguntar qual o gerenciador de pacotes que vamos utilizar e escolheremos o npm.
![npm choice](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pddvwqlrd8teph5mqmql.png) feito isso, a instalação será feita e uma mensagem de sucesso aparecerá ao final.
![sucess install](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/26955edbni40w0z3wr8e.png)

Legal, criamos o projeto, mas não para por aí. Vamos reabrir o VSCode na pasta alura-challenges-2 que o Nest criou e repare que já nos foi disponibilizado toda uma organização de pastas e configurações de testes, linter, prettier e git, o que já nos adianta demais, só que para elevar ainda mais o nível, vamos adicionar algumas outras ferramentas que vão nos ajudar na padronização do código.

Para que a gente proteja e padronize nossos commits, vamos utilizar os pacotes: 
husky e lint-staged
```bash
npm install husky@4 lint-staged --save-dev
``` 
e adicionar no nosso package.json
```json
"husky": {
  "hooks": {
    "pre-commit": "lint-staged"
  }
},
"lint-staged": {
  "*.ts": [
    "eslint --fix", "npm test", "git add"
  ]
}
```
vamos instalar também os pacotes commitlint e commitizen
```bash
npm i @commitlint/config-conventional @commitlint/cli commitizen --save-dev
```
Assim que terminar a instalação, execute:
```bash
npx commitizen init cz-conventional-changelog --save-dev --save-exact --force
```

precisaremos agora criar um arquivo na raiz do projeto com o nome commitlint.config.js e o conteúdo
```javascript
module.exports={
  extends: ['@commitlint/config-conventional']
}
```
após a criação desse arquivo, vamos executar o comando:
```bash
npx mrm lint-staged
```
e após ele, vamos adicionar mais dois hooks no husky, com os comandos:
```bash
npx husky add .husky/commit-msg 'npx commitlint --edit "$1"'
```
```bash
npx husky add .husky/prepare-commit-msg 'exec < /dev/tty && git cz --hook || true'
```
Com isso, teremos a segurança de que só conseguiremos efetuar commits seguindo os padrões do [conventional commits](https://www.conventionalcommits.org/pt-br/v1.0.0/) e passando nos testes. 
Vamos testar?

Adicionaremos todos os arquivos alterados:
```bash
git add .
```
E faremos o commit:
```bash
git commit
```
Ao fazer isso, o husky irá chamar o lint-staged, que por sua vez rodará os comandos que colocamos no package.json, chamando a CLI do commitlint, se tudo estiver correto.
E a partir daí, você vai preenchendo conforme a sua alteração:
![cz_question](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rqvcjh9ujh8jqvirgt0.png)

Após responder tudo, ele fará o commit (já padronizado)
![commit_result](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ornhwgfmyyxnoez725c7.png)

Exemplo: (git log)
![git log](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mr7p45uk138lponpwejw.png)


Ufa! Por enquanto é isso...


> "Uma das melhores formas de aprender é se propor a ensinar..."



Eu criei esses posts com a intenção de exercitar e fixar meus conhecimentos, mas talvez isso ajude você que está lendo também. 
Se você gostou desse post, reaja, comente, compartilhe... enfim, faça algo para eu sentir que não falei sozinho. rs

Abraços e até os próximos...