O objetivo do projeto, foi criar uma loja de itens medievais, no formato de uma API, utilizando Typescript!
A aplicação foi desenvolvida em Node.js e TypeScript, utilizando a arquitetura MSC - Model, Service, Controller -, juntamente a SQL para realizar o CRUD dos itens.
Para realizar as validações de entrada, foi utilizados a biblioteca JOI e para a geração e autenticação de token foi utilizado o JSON Web Token - JWT.
Clone o repositório:
git@github.com:BrunoPelegrino/trybesmith.git
🐳 Rodando no Docker vs Localmente
Rode os serviços
node
edb
com o comandodocker-compose up -d
.
- Lembre-se de parar o
mysql
se estiver usando localmente na porta padrão (3306
), ou adapte, caso queira fazer uso da aplicação em containers - Esses serviços irão inicializar um container chamado
trybesmith
e outro chamadotrybesmith_db
. - A partir daqui você pode rodar o container
trybesmith
via CLI ou abri-lo no VS Code.
Use o comando
docker exec -it trybesmith bash
.
- Ele te dará acesso ao terminal interativo do container criado pelo compose, que está rodando em segundo plano.
Instale as dependências [Caso existam] com
npm install
⚠ Atenção ⚠ Caso opte por utilizar o Docker, TODOS os comandos disponíveis nopackage.json
(npm start, npm test, npm run dev, ...) devem ser executados DENTRO do container, ou seja, no terminal que aparece após a execução do comandodocker exec
citado acima.
⚠ Atenção ⚠ O git dentro do container não vem configurado com suas credenciais. Ou faça os commits fora do container, ou configure as suas credenciais do git dentro do container.
⚠ Atenção ⚠ Não rode o comando npm audit fix! Ele atualiza várias dependências do projeto, e essa atualização gera conflitos com o avaliador.
⚠ Atenção ⚠ Caso você esteja usando macOS e ao executar o docker-compose up -d
se depare com o seguinte erro:
The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.db: 'platform'
Unsupported config option for services.node: 'platform'
Foram encontradas 2 possíveis soluções para este problema:
- Você pode adicionar manualmente a option
platform: linux/amd64
no service do banco de dados no arquivo docker-compose.yml do projeto, mas essa é uma solução local e você deverá reproduzir isso para os outros projetos.- Você pode adicionar manualmente nos arquivos .bashrc, .zshenv ou .zshrc do seu computador a linha
export DOCKER_DEFAULT_PLATFORM=linux/amd64
, essa é uma solução global. As soluções foram com base nesta fonte.
✨ Dica: A extensão Remote - Containers
(que estará na seção de extensões recomendadas do VS Code) é indicada para que você possa desenvolver sua aplicação no container Docker direto no VS Code, como você faz com seus arquivos locais.
Instale as dependências [Caso existam] com
npm install
⚠ Atenção ⚠ Não rode o comando npm audit fix! Ele atualiza várias dependências do projeto, e essa atualização gera conflitos com o avaliador.
✨ Dica: Para rodar o projeto desta forma, obrigatoriamente você deve ter o node
instalado em seu computador.
✨ Dica: O avaliador espera que a versão do node
utilizada seja a 16.
- Criar uma API RESTful utilizando a arquitetura MSC (Model-Service-Controller);
- Utilizar o banco de dados com o MySQL.
- Criar uma aplicação utilizando TypeScript
- Validar dados das requisições com a biblioteca Joi.
POST /login
• Se o login for feito com sucesso retorna um token para o usuário.
• O endpoint deve receber a seguinte estrutura:
{
"username": "string",
"password": "string"
}
POST /products
• Cadastra um novo produto.
• O endpoint deve receber a seguinte estrutura:
{
"name": "string",
"amount": "string"
}
GET /products
• Retorna todos os produtos do banco de dados.
POST /users
• Cadastra um novo usuário.
• O endpoint deve receber a seguinte estrutura:
{
"username": "string",
"classe": "string",
"level": "number",
"password": "string"
}
GET /orders
• Retorna todos os pedidos e os ids dos produtos associados a estes.
POST /orders
• Cadastra novos pedidos.
• O pedido só é criado caso a pessoa usuária esteja logada e o token JWT validado.
• O endpoint deve receber a seguinte estrutura:
{
"productsIds": [1, 2]
}
⌨️ desenvolvido por Bruno Pelegrino