API incrível para demonstração de habilidades técnicas como desenvolvedor backend.
Contém rotas HTTP para o gerenciamento completo de super heróis e combate de ameaças ao redor do mundo.
A lógica da aplicação conecta o servidor ao socket.io que dispara ameaças a cada 30 segundos.
Para resolver a ameaça, essa aplicação considera a latitude e longitude de cada herói, enviando o herói mais próximo e com nível adequado para cada tipo de ameaça.
-
Autenticação e cadastro ✅
-
CRUD de heróis ✅
-
Alocação de heróis ✅
-
Histórico de ameaças ✅
-
Alocação de heróis inteligente ✅
- Docker
- Node.js
- Express
- Cors
- Jsonwebtoken
- Postgres
- MongoDB
- Node-schedule
O ambiente do projeto está dockerizado, portanto, instale antes de prosseguir, link de referencia.
A aplicação utiliza as imagens postgres
e mongodb
diretamente do dockerhub e a imagem app
criada através do arquivo Dockerfile
.
A imagem app
tem multiplos passos de criação, separando a responsabilidade de build
e execução, melhorando aspectos de tamanho e performance da imagem construída.
Para iniciar a aplicação na porta 3333, executado com o comando:
docker-compose up
Os testes de aplicação podem ser realizados diretamente no container, execute o comando:
docker-compose run app npm test
Todo código fonte da aplicação está mantido em src
.
A aplicação utiliza uma chave secret.key
para assinar o JWT durante a autenticação do usuário.
Chain of Responsibility é um padrão de design comportamental que permite passar solicitações ao longo de uma cadeia de manipuladores. Ao receber uma solicitação, cada manipulador decide processá-la ou passá-la para o próximo manipulador na cadeia.
Observer é um padrão de design comportamental que permite definir um mecanismo de assinatura para notificar vários objetos sobre quaisquer eventos que aconteçam com o objeto que eles estão observando.
Builder é um padrão de design criacional que permite construir objetos complexos passo a passo. O padrão permite produzir diferentes tipos e representações de um objeto usando o mesmo código de construção.
Singleton é um padrão de design criacional que permite garantir que uma classe tenha apenas uma instância, ao mesmo tempo que fornece um ponto de acesso global para essa instância.
Single responsibility principle cada classe deveria ter apenas uma responsabilidade
Open-closed principle entidades de software (classes, módulos, funções, etc.) devem ser abertas para extensão, mas fechadas para modificação.
A aplicação utiliza banco de dados relacional (postgres)
e não relacional (mongodb)
, a propósito de demonstração de conhecimento.
O banco de dados SQL pode ser gerenciado pela ferramenta de linha de comando sequelize-cli
, as configurações estão presentes no diretório config
.
O utilitário sequelize-cli
está configurado para realizar e reverter alterações no banco de dados utilizando os diretórios migrations
e seeders
.
As rotas da aplicação podem ser importadas pelo arquivo zrp-challenge-requests-http.json
utilizando o insomnia
.
# [POST] Cadastro de novos usuários
http:localhost:3333/auth/signup
# [POST] Login de usuários cadastrados
http:localhost:3333/auth/signin
# [GET] Leitura de heróis
http:localhost:3333/heroes
# [POST] Cadastro de heróis
http:localhost:3333/heroes
# [PUT] Alteração de heróis
http:localhost:3333/heroes/:id
# [DELETE] Remoção de heróis
http:localhost:3333/heroes/:id
# [GET] Lista de ameaças a serem resolvidas
http:localhost:3333/threats
# [POST] Cadastro de nova ocorrência
http:localhost:3333/occurrence
# [GET] Lista de batalhas (Ameaças resolvidas)
http:localhost:3333/battles
A seguir uma breve descrição dos scripts:
npm run build # Executa o compilador typescript
npm start # Inicia a aplicação node javascript
npm run lint # Padroniza o código fonte com regras eslint
npm run migration # Executa comandos DDL no banco de dados postgres
npm run seeds # Insere uma lista de heróis pré-definida no banco de dados.
O framework utilizado para testes é o vitest
e o seu arquivo de configuração é o vite.config.mjs
.
O script de test também invoca os scripts pretest
e posttest
, responsáveis por configurar o banco de dados de teste da aplicação e reverter as alterações após os testes.
npm test # Executa os testes da aplicação
npm run dev # Executa a aplicação em modo desenvolvimento
Para aplicação em modo produção, as variáveis de ambiente necessárias para executar o projeto não devem estar incluídas no repositório. Sendo este apenas uma demonstração, credenciais estão incluídas para facilitar a execução.
Para aplicativos de produção, utilizar .env.example com as variáveis necessárias com valor vazio.
Colabore com o projeto através de Pull requests.
Encontrou algum erro? Reporte em Issues