https://github.com/fabiosperotto/api-players-express
Projeto de aprendizado de programação de API RESTful com Nodejs + Express + Ajv + Sequelize
https://github.com/fabiosperotto/api-players-express
ajv-validation educational-project express nodejs rest-api restful-api sequelize sequelize-orm
Last synced: 6 months ago
JSON representation
Projeto de aprendizado de programação de API RESTful com Nodejs + Express + Ajv + Sequelize
- Host: GitHub
- URL: https://github.com/fabiosperotto/api-players-express
- Owner: fabiosperotto
- License: isc
- Created: 2023-08-30T16:36:48.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-05-29T18:16:19.000Z (over 1 year ago)
- Last Synced: 2025-05-18T15:13:40.833Z (8 months ago)
- Topics: ajv-validation, educational-project, express, nodejs, rest-api, restful-api, sequelize, sequelize-orm
- Language: JavaScript
- Homepage:
- Size: 43 KB
- Stars: 1
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Game-API - Pack de Aprendizado
Pacote de programação para disciplinas de desenvolvimento web back-end, utilizando Javascript com Nodejs + [Express](https://expressjs.com/). O Objetivo é servir de exemplo para a elaboração de uma API para comunicar dados em JSON a respeito de uma modelagem. É uma API RESTful com validações de schemas JSON ([Ajv](https://ajv.js.org/)) e para autenticação utiliza JWT Token ([jsownwebtoken](https://github.com/auth0/node-jsonwebtoken)). Na persistência de dados, se utiliza o ORM [Sequelize](https://sequelize.org/) com banco de dados em MySQL.
Este projeto faz parte de uma série de aprendizado em APIs. Nesta mesma série, você pode acessar o mesmo projeto implementado com [PHP e Lumen](https://github.com/fabiosperotto/pratica-api-rest).
## Compatibilidade
- Nodejs 18.16.x;
- npm 9.5.x;
- Express 4.18.2
- MySQL 8.0;
- Ajv 8.12.0;
- cors 2.8.5;
- jsonwebtoken 9.0.1;
- mysql2 3.6.0;
- sequelize 3.6.0.
### Docência
Se você é docente da área, pode entrar em contato para obter slides e dicas sobre o desenvolvimento de aulas com este projeto.
## Recursos
- Utilização do framework Express como base;
- Validação de documentos JSON com Ajv;
- ORM Sequelize para criação/alteração de banco de dados relacionais, incluindo relacionamento entre tabelas.
- Aplicações de configurações sobre [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) e [Bearer Tokens](https://oauth.net/2/bearer-tokens/);
## Modelagem de Referência
Este projeto faz referência a uma modelagem hipotética de um game, da relação entre um jogador e seus equipamentos.

## Pré-requisitos:
1. Ambiente local de desenvolvimento:
- Se Windows: instalações [node e npm](https://treehouse.github.io/installation-guides/windows/node-windows.html) e [MySQL](https://dev.mysql.com/downloads/installer/);
- Se Linux: instalações [node e npm](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-22-04) e [MySQL](https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-22-04);
2. Para acessar o banco de dados, caso não queira manipular o BD via linha de comando, pode utilizar um ou mais softwares clientes, como [MySQL Workbench](https://www.mysql.com/products/workbench/) ou [DBeaver](https://dbeaver.io/).
3. Para usuários Windows recomenda-se sempre utilizar o [Git Bash for Windows](https://gitforwindows.org/) a fim de executar comandos similares ao estilo linux das aulas. Pode usar o terminal do [Visual Studio Code](https://code.visualstudio.com/).
## Organização do Projeto
O projeto segue uma estrutura em MVC com arquivos individuais de rotas e validadores JSON:
- /app
- /commons: helpers reutilizáveis pela aplicação;
- /controllers: os Controllers da aplicação;
- /middlewares: reúne todos os middlewares da aplicação;
- /models: reúne as Models e o inicializador index para o ORM;
- /routes: arquivos de rotas da aplicação;
- /schemas: os esquemas JSON utilizados para validações na aplicação;
- modelagem: documentações sobre o banco de dados.
- app.js: componente de inicialização do projeto.
- config.js: reúne propriedades configuráveis globais da aplicação.
## Instalação e Configuração
1. Fazer o download/fork/cópia deste repositório.
2. Instalar via npm o projeto:
```console
dev@pc:~$ cp .env.example .env
dev@pc:~$ npm install
```
3. Verifique se o primeiro comando resultou na cópia correta do .env.example para .env. Em seguida preencha corretamente todas as variáveis de ambiente do arquivo .env.
4. Para executar o projeto, acesse o diretório da aplicação e execute um dos comandos abaixo:
```console
dev@pc:~$ npm run dev
#ou
dev@pc:~$ npx nodemon
```
## Documentação
### Validação de dados JSON com Ajv
Ao receber documentos JSON do cliente, este projeto utiliza a biblioteca Ajv para avaliar se na estrutura do documentos os dados encontram-se adequados conforme a necessidade do back-end. Para criar um schema de validação verifique exemplo em app/schemas. Poderá especificar regras de campos obrigatórios, tipos de dados que cada campo deve ser, dentre outros.
Para utilizar o validador automatizado, no controller é necessário realizar a chamada do objeto do Ajv, informar o objeto de schema de validação (item anterior). Depois é necessário apenas informar o conjunto de dados recebido (pode ser o corpo da requisição) ao validador para que o mesmo avalie toda a estrutura. Um exemplo pode ser consultado no método create em app/controllers/JogadorController.
### Banco de Dados
Este projeto utiliza o ORM Sequelize, onde por meio do arquivo app/models/conexao.js é realizada a conexão com o banco de dados. A parametrização do Sequelize consta em config.js.
Cada model do projeto (app/models) é uma classe com dados privados (comum em JS). Entretanto, na mesma classe, a Model do Seuqelize para cada entidade é inicializada. A ideia é que métodos comuns do ORM como create, update, dentre outros, sejam acopladas a classe comum da model. Isto facilita caso futuramente seja necessário trocar o Sequelize por outro framework. Cada model téncicamente exporta a sua classe e a model sequelize conectada, respectivamente.
Em app/models/index.js é realizada a importação das models e a sincronização com banco de dados. A sincronização verifica se existe a tabela da model criada no BD e caso não existir, cria as tabelas necessárias. Em app/models/relations.js são implementados e configurados os relacionamentos entre as models (o que pode ser também feito dentro de cada classe), a partir destas configurações, quando o Sequelize for criar as tabelas, os relacionamentos também serão gerados.
### Autenticação
Para a utilização da API é necessário ter um token de acesso que deverá ser enviado pelo lado do cliente, via cabeçalho da requisição, para esta API autorizar o consumo de dados. No cabeçalho deve ser especificado Bearer token, onde token é gerado para um cliente conhecido. Um middleware em app/middlewares tem por responsabilidade ser o intermediário, avaliando se existe o token na requisição e se o mesmo é válido.
O projeto segue o padrão de implementação de tokens via JWT Token. É necessário que um cliente que deseja utilizar a API faça o cadastro para se tornar um cliente conhecido e autorizado. Ao fazer o cadastro o token é gerado e retornado ao cliente. Por padrão cada token tem um tempo de validade definido em config.js (jwt.expiration).
Também existe a implementação de login para os clientes, ao enviar e-mail e senha corretos para esta API, a mesma verificará as credenciais e irá gerar um token. No final desta mesma requisição o cliente deverá receber um token de acesso para utilizar normalmente a API.
## Documentações Extermas
[Express](https://expressjs.com/pt-br/)
[Sequelize ORM](https://sequelize.org/docs/v6/getting-started/)
## Dependências
[npm](https://www.npmjs.com/)
## Contribuindo com o projeto
Serão aceitas atualizações de pacotes, correções de bug e melhorias didáticas. Novas funcionalidades podem serem debatidas e adicionadas ao projeto se verificado necessidade do desenvolvimento de back-end de um jogo completo.