/Medieval-MarketShop

Loja de itens medievais no formato de uma API para realização de CRUD no banco de dados, e utilizando arquitetura MSC.

Primary LanguageTypeScript

Boas vindas ao repositório do projeto Medieval MarketShop!

O que foi desenvolvido 👨‍💻

Para este projeto, foi criado uma loja de itens medievais, no formato de uma API, utilizando Typescript.

A aplicação possui alguns endpoints que irão ler e escrever em um banco de dados, utilizando o MySQL, nela será possível realizar as operações básicas que se pode fazer em um determinado banco de dados: Criação, Leitura, Atualização e Exclusão (CRUD - Create, Read, Update e Delete).

Alem disso foi utilizado para desenvolver todas as camadas da aplicação a arquitetura MSC (Models, Service e Controllers).

Foi utilizado:

  • TypeScript,
  • Node,
  • Express,
  • Docker,
  • MySQL,
  • Joi,
  • JWT.

Orientações específicas deste projeto

🐳 Rodando no Docker vs Localmente

Com Docker

Rode os serviços node e db com o comando docker-compose up -d.

  • Lembre-se de parar o mysql se estiver usando localmente na porta padrão (3306), ou adapte, caso queria fazer uso da aplicação em containers
  • Esses serviços irão inicializar um container chamado trybesmith e outro chamado trybesmith_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 no package.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 comando docker exec citado acima.

⚠ Atenção ⚠ O git dentro do container não vem configurado com suas credenciais. Faça os commits fora do container, ou configure as suas credenciais do git dentro do container.

⚠ 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:

  1. 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.
  2. 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.

Sem Docker

Instale as dependências [Caso existam] com npm install

Dica: Para rodar o projeto desta forma, obrigatoriamente você deve ter o node instalado em seu computador.

🎲 Diagrama Entidade Relacionamento do projeto
O banco de dados do projeto segue a estrutura abaixo:
🏦 Conexão com o Banco

A conexão do banco local deverá conter os seguintes parâmetros:

import dotenv from 'dotenv';
import mysql from 'mysql2/promise';

dotenv.config();

const connection = mysql.createPool({
  host: process.env.MYSQL_HOST,
  user: process.env.MYSQL_USER,
  password: process.env.MYSQL_PASSWORD,
}); // sua conexão NÃO deve ter o database, este deve ser especificado em cada query

export default connection;

⚠️ É essencial configurar essas 3 variáveis de ambiente para testar o projeto localmente: ⚠️

  host: process.env.MYSQL_HOST
  user: process.env.MYSQL_USER
  password: process.env.MYSQL_PASSWORD

⚠️ Existe um arquivo já criado chamado .env.example onde estão listadas as variáveis de ambiente esperadas no projeto. ⚠️

⚠️ É essencial que seu arquivo tenha o nome connection.ts e esteja no diretório src/models ⚠️

🪑 Tabelas

O banco terá três tabelas: pessoas usuárias, produtos e pedidos.

DROP SCHEMA IF EXISTS Trybesmith;
CREATE SCHEMA IF NOT EXISTS Trybesmith;

CREATE TABLE Trybesmith.users (
  id INTEGER AUTO_INCREMENT PRIMARY KEY NOT NULL,
  username TEXT NOT NULL,
  vocation TEXT NOT NULL,
  level INTEGER NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE Trybesmith.orders (
  id INTEGER AUTO_INCREMENT PRIMARY KEY NOT NULL,
  user_id INTEGER,
  FOREIGN KEY (user_id) REFERENCES Trybesmith.users (id)
);

CREATE TABLE Trybesmith.products (
  id INTEGER AUTO_INCREMENT PRIMARY KEY NOT NULL,
  name TEXT NOT NULL,
  amount TEXT NOT NULL,
  order_id INTEGER,
  FOREIGN KEY (order_id) REFERENCES Trybesmith.orders (id)
);

O arquivo Trybesmith.sql contém as queries que criam e populam o banco como o teste faz, e os testes restauram o banco de dados após sua execução.

Para que o avaliador funcione corretamente, tanto local quanto remoto, sua connection.ts não deve conter o database e suas queries devem conter o banco de dados explicitamente como o exemplo abaixo:

SELECT * FROM Trybesmith.products;
🎛 Linter

Usaremos o ESLint para fazer a análise estática do seu código.

Este projeto já vem com as dependências relacionadas ao linter configuradas nos arquivos package.json.

Para poder rodar o ESLint em um projeto basta executar o comando npm install dentro do projeto e depois npm run lint. Se a análise do ESLint encontrar problemas no seu código, tais problemas serão mostrados no seu terminal. Se não houver problema no seu código, nada será impresso no seu terminal.

Você pode também instalar o plugin do ESLint no VSCode. Para isso, basta fazer o download do plugin ESLint e instalá-lo.

🍪 Informações sobre a API
  • O projeto deve rodar na porta 3000;

  • O arquivo index.ts existe para rodar corretamente os testes. Toda a chamada de rotas do projeto deverá ser feita dentro do arquivo app.ts;


Todos os seus endpoints devem estar no padrão REST

  • Use os verbos HTTP adequados para cada operação;

  • Agrupe e padronize suas URL em cada recurso;

  • Garanta que seus endpoints sempre retornem uma resposta, havendo sucesso nas operações ou não;

  • Retorne os códigos de status corretos (recurso criado, erro de validação, etc).