A API segue as orientações básicas do desafio. Procurei seguir as orientações do ExpressJS tanto na parte de segurança quanto na parte do deploy. Isso se traduziu em Rate Limiting global e específico para rota de autenticação, Logs espalhados pela aplicação, Error Handling generalizado e outros ajustes menores.
Para além disso, fiz um simples sistema de acesso onde apenas usuários com acesso de ADMIN conseguem criar,editar e remover usuários, validação em camadas anteriores à da regras de negócio.
A rota de listagem dos usuários (GET /users
) retorna os dados "paginados", sendo possível verificar tais dados a partir dos headers X-Total-Count
(número total de items, no caso tarefas) e X-Total-Pages
.
A estratégia de autenticação foi o uso de JWT, as chaves são geradas automaticamente caso nenhuma seja passada via variáveis de ambiente. É possível configurar o tipo de algoritmo utilizado no arquivo src/config/index.ts
.
A organização da API foi inspirada nos projetos do NestJS onde existe módulo, controlador e serviço. As rotas são facilmente encontradas e o sufixo de muitos arquivos facilita a compreensão da função de cada um deles.
Comentei pouco pois tentei fazer o código o mais explícito o possível, certas partes vale o conhecimento da biblioteca em uso para uma compreensão melhor do que está sendo feito
- Primeiro clone o projeto:
git clone https://github.com/RenanGalvao/code-challenge-prounion-2.git
- Acesse a pasta clonada
code-challenge-prounion-2
- Navegue até a pasta
backend
- Crie uma cópia do arquivo
.env.example
com o nome de.env
- Instale os pacotes necessários
npm install
- Suba o servidor
npm run dev
- URL de acesso:
http://localhost:3000
- Usuário:
[email protected]
- Senha:
12345678
Inicie o projeto a partir do docker-compose.yml
da pasta raiz.
POST /auth/sign-in
retorna dados sobre o usuário e token de autenticação, espera um JSON com as chaves:email
epassword
.GET /users
retorna a lista de usuários cadastrados, aceita parâmetros de pesquisapage
eitemsPerPage
, sendo ambos valores númericos.GET /users/:id
retorna dados do usuário associado ao id.POST /users
cria um novo usuário e retorna seus dados, espera um JSON com as chaves:name
,email
,password
erole
(sendo o valor "USER" ou "ADMIN").PUT /users/:id
atualiza e retorna seus os dados do usuário associado ao id, o JSON esperado contém as mesmas chaves que o da criação, no entanto todos os campos são opcionais.DELETE /users/:id
remove o usuário associado ao id.GET /health
utilizada para verificar a saúde da API, retorna ouptime
da aplicação.
- Docker - Virtualização
- PostgreSQL - Banco de Dados
- NodeJs - Runtime
- Express - Framework