Este desafio tem como objetivo auxiliar pessoas desenvolvedoras que buscam oportunidades no mercado de trabalho ou desejam aprimorar suas habilidades em NodeJS. A UserAPI proporciona a chance de explorar autenticação, manipulação de banco de dados, criação de APIs RESTful, teste unitário, documentação com Swagger, middlewares, variáveis de ambiente, versionamento com Git e, opcionalmente, o uso de Docker.
-
Autenticação:
- Implemente um sistema de autenticação com JWT (JSON Web Tokens).
- Utilize pacotes como
jsonwebtoken
para a geração e verificação de tokens. - Utilize a biblioteca
bcrypt
para garantir a segurança das senhas.
-
Conexão com Banco de Dados:
- Utilize um banco de dados SQL, como PostgreSQL, e o pacote
pg
para estabelecer a conexão. - Crie uma tabela "users" com campos como ID, nome, e-mail, senha, etc.
- Considere o uso do ORM
Sequelize
para facilitar a interação com o banco de dados.
- Utilize um banco de dados SQL, como PostgreSQL, e o pacote
-
RESTful API:
- Desenvolva uma API RESTful com os seguintes casos de uso:
- Registrar Usuário:
- Ator Principal: Novo Usuário.
- Fluxo Principal:
- O usuário fornece nome, e-mail e senha.
- O sistema cria um novo registro de usuário no banco de dados.
- Autenticar Usuário:
- Ator Principal: Sistema de Autenticação.
- Fluxo Principal:
- O usuário fornece e-mail/senha.
- O sistema verifica as credenciais.
- Se válidas, o sistema gera um token JWT.
- Obter Dados do Usuário Autenticado:
- Ator Principal: Usuário autenticado.
- Fluxo Principal:
- O usuário envia uma solicitação para seus próprios dados.
- O sistema verifica o token JWT e retorna os dados.
- Atualizar Dados do Usuário:
- Ator Principal: Usuário autenticado.
- Fluxo Principal:
- O usuário envia uma solicitação para atualizar seus dados.
- O sistema verifica o token JWT e atualiza os dados.
- Listar Usuários (Apenas para Administradores):
- Ator Principal: Administrador.
- Fluxo Principal:
- O administrador solicita a lista de usuários.
- O sistema verifica o token JWT e retorna a lista (se o usuário for um administrador).
- Excluir Usuário (Apenas para Administradores):
- Ator Principal: Administrador.
- Fluxo Principal:
- O administrador solicita a exclusão de um usuário.
- O sistema verifica o token JWT e exclui o usuário do banco de dados (se o usuário for um administrador).
- Registrar Usuário:
- Considere alternativas ao framework Express.js, como Fastify ou Koa.js, para criar as rotas.
- Utilize o middleware
body-parser
para facilitar o tratamento de dados JSON nas requisições. - Utilize middlewares para validação de token JWT em rotas protegidas e para tratamento de erros.
- Desenvolva uma API RESTful com os seguintes casos de uso:
-
Uso de Middlewares:
-
Implemente um middleware para autenticação baseada em JWT.
-
Crie um middleware para tratamento de erros, fornecendo mensagens amigáveis e códigos HTTP apropriados.
-
Exemplo: Middleware de Autenticação
javascriptCopy code const jwt = require('jsonwebtoken'); function authenticateJWT(req, res, next) { const token = req.header('Authorization'); if (!token) return res.status(401).json({ message: 'Unauthorized' }); jwt.verify(token, process.env.JWT_SECRET, (err, user) => { if (err) return res.status(403).json({ message: 'Forbidden' }); req.user = user; next(); }); } // Uso do Middleware app.get('/api/private', authenticateJWT, (req, res) => { // Rota protegida res.json({ message: 'Authenticated' }); });
-
-
Tratamento de Erro:
- Implemente um tratamento de erro consistente em toda a aplicação.
- Forneça mensagens de erro claras e códigos HTTP apropriados em caso de falhas.
-
Variáveis de Ambiente:
- Utilize o pacote
dotenv
para carregar variáveis de ambiente a partir de um arquivo.env
. - Exemplo:
-
Crie um arquivo
.env
na raiz do projeto:makefileCopy code PORT=3000 DATABASE_URL=postgres://usuario:senha@localhost:5432/nome-do-banco JWT_SECRET=seuSegredoJWT
-
- Utilize o pacote
-
Git:
- Inicie um repositório Git para o projeto.
- Faça commits incrementais, mantendo uma boa mensagem de commit.
- Crie um arquivo
.gitignore
para excluir arquivos desnecessários do repositório.
-
README Detalhado:
- Forneça um README detalhado explicando o propósito do projeto, como configurar o ambiente de desenvolvimento e iniciar o projeto.
- Inclua exemplos claros de como realizar as principais operações, como registro, login, e manipulação de usuários.
- Destaque as dependências e versões necessárias.
- Forneça informações sobre variáveis de ambiente essenciais.
- Uso de Docker:
- Considere a criação de um arquivo
Dockerfile
para facilitar a execução do aplicativo em um contêiner Docker. - Utilize o
docker-compose
para orquestrar múltiplos serviços, como o aplicativo Node.js e o banco de dados PostgreSQL. - Inclua instruções claras no README sobre como usar o Docker para configurar e executar o ambiente.
- Considere a criação de um arquivo
- Documentação de Tecnologias Utilizadas:
- Crie um documento opcional listando as tecnologias usadas no projeto.
- Discorra sobre cada tecnologia, explicando o que é, para que serve e forneça exemplos.
- Testes Unitários:
- Escreva testes unitários utilizando Mocha ou Jest.
- Utilize a biblioteca
supertest
para testar as requisições à API. - Considere o uso de
sinon
para criar stubs e espiões durante os testes.
- Documentação da API:
- Adicione uma seção detalhada no README (ou faça da maneira como preferir) explicando como os usuários podem interagir com a API.
- Utilize exemplos de requisições, parâmetros necessários e formatos de resposta.
- Considere incluir exemplos de uso com ferramentas como Swagger.
- Funcionalidade: O sistema deve autenticar usuários, interagir com o banco de dados e oferecer operações CRUD através da API.
- Segurança: Garanta que a autenticação seja segura, e as senhas estejam devidamente protegidas.
- Organização do Código: Estruture o código de maneira modular e organizada.
- Documentação: Inclua comentários relevantes, documentação explicativa e utilize o Swagger para facilitar a compreensão da API.
- Testes Unitários: Certifique-se de que os testes cubram os principais cenários de uso e possíveis falhas.
- Conexão com o Banco de Dados: A conexão deve ser segura, e as operações no banco de dados devem ser eficientes.
- Uso de Middlewares: Demonstre habilidade na implementação e utilização de middlewares para autenticação e tratamento de erros.
- Tratamento de Erro: Implemente um tratamento de erro consistente em toda a aplicação.
- Variáveis de Ambiente: Utilize variáveis de ambiente para configurar o projeto de maneira flexível.
- Git: Mantenha um histórico de commits organizado, exclua arquivos desnecessários do repositório.
- README Detalhado: Forneça um guia claro e completo sobre como configurar, executar e interagir com o projeto.
- Documentação da API: Inclua uma seção detalhada no README explicando como os usuários podem interagir com a API, com exemplos de requisições e formatos de resposta.