NestJS - Aprendendo do zero
Published: 2023-07-16 08:27:20


Olá a todos, ou talvez olá apenas pra mim mesmo, primeiro quero começar explicando a razão de criar um post sobre NestJS, sendo que já há milhares de artigos por aí, muitos melhores que este, mas a razão é que, como estou trabalhando com este framework recentemente, sempre gosto de escrever, e tentar "aprender ensinando", sendo uma tática bem efetiva para mim, sendo assim, após está pequena introdução, vamos por a "mão na massa".

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmx5z59j2f9rnhptvafr.png)


A primeira coisa que devemos entender é o _O que é o NestJS?_, _Quais as vantagens de utilizá-lo?_ E isso são perguntas que podemos sempre consultar fóruns, posts no stackoverflow mais principalmente o nosso amigo nessa série de artigos, que é a [documentação](https://docs.nestjs.com/). 

Vamos analisar a primeira frase **"Nest (NestJS) is a framework for building efficient, scalable Node.js server-side applications"** vemos aqui diversas palavras que são de extrema valia para nós, que é "scalable", hoje sempre ao desenvolver uma aplicação devemos pensar na escalabilidade, e a outra buzzword aqui é **efficient**, sendo assim, o NestJS já se vende muito bem logo em sua primeira frase. 

Algo muito importante na utilização do NestJS é que o mesmo oferece um suporte total para a utilização do Typescript, que é de extrema importância durante o desenvolvimento, ajudando e muito a evitar erros em runtime. 

Algo que muito deve-se levar em conta ao escolher um determinado framework, é se o mesmo está atualizado, se tem uma comunidade que ajuda o desenvolvimento para que o mesmo não fique obsoleto ou ainda pior vulneráveis a falhas em packages que são utilizados. Algo que podemos ficar tranquilos e relação ao NestJS pois se olharmos sua página no [github](https://github.com/nestjs/nest) terá mais de 58k de estrelas no repositório e mais de 7K Forks.

Vale ressaltar que o NestJS não é uma bala de prata, e que pode ser, dependendo do problema que você está disposto a resolver, seria "matar uma formiga com uma bazuca", então sempre antes de tomar uma decisão de qual framework for vir a utilizar, analise se o mesmo é necessário para o _usecase_ em questão. 

Após essa introdução, vamos começar a brincar com o NestJS. 
A primeira coisa que deve-se verificar é se o NodeJS e o npm está instalado em sua máquina, para verificar, abre o terminal e execute o comando abaixo: 

`node --version && npm --version`

Caso não esteja, a instalação é fácil e pode ser feita usando [homebrew](https://formulae.brew.sh/formula/node), ou usando o [NodeJS org](https://nodejs.org/en).

Sendo assim, o próximo passo é instalar o NestJS-CLI, que é facilmente instalado utilizando o comando 

`$ npm i -g @nestjs/cli`

Após a instalação ser feita, o próximo e tão esperado passo é começar o projeto.

Não irei descrever a fundo a estrutura do projeto, pois iremos fazer isso conforme formos desenvolvendo o projeto, mas para iniciar um novo projeto no NestJS basta executar o comando:

`nest new <projet_name>`

O projeto que será desenvolvido será baseado no desafio da Pagar.me, com algumas adaptações para deixá-lo mais completo
[https://github.com/pagarme/vagas/blob/master/desafios/software-engineer-backend/README.md](link para o desafio).

Este está começando a ficar muito extenso, então para finalizá-lo, vamos discorrer um pouco sobre o projeto, os principais cenários, e posteriormente, a parte mais divertida que é programar.

> Em sua essência um PSP tem duas funções muito importantes:
> Permitir que nossos clientes processem transações ("cash-in")
> Efetuar os pagamentos dos recebíveis para os nossos clientes ("cash-out")

Então já conseguimos verificar algumas ações e personas que serão parte do nosso projeto. Temos a persona cliente, que neste caso realizará a ação de pagar/transacionar algum valor, ou ainda este cliente é possível ter um valor a receber, devemos então ter um módulo de clientes, ao qual será possível realizar as operações básicas de inserção/remoção... E relacionar este cliente com as ações de _transactions ou payables_. 

Sendo assim, vamos começar pensando nesta estrutura dos clientes. O nest-cli nos ajuda muito com diversos scaffold, sendo assim é muito prático executar o comando, 
`nest g resource client`
Com este comando, será criada a seguinte estrutura:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yoc45o2njmonvo02afd4.png)

Este artigo tem ficado muito extenso, e já não sei se alguém chegou até aqui, sendo assim, vamos encerrar por agora este artigo, e continuar em outro com a implementação do módulo de clientes.