Api Rest para locação de vídeos/filmes criada com NodeJs com endpoins de cadastro de vídeos (CRUD) e marcação de locação com listagem de filmes em atraso de devolução de filmes.
Summary
- Features
- Arquitetura
- Configurando o ambiente e subindo a aplicação
- Pacotes Usados
- EndPoints
- Funções Logicas
- Variáveis de ambiente
A organização do código foi baseada no MVC porem ultilizado o melhor forma de desacoplamento das funcionalidades, visando a simplicidade na hora de encontar as suas respectivas funções.
ORM para integração com o banco de dados Como ORM foi usado o Sequelize. Foi ponderado o Kenex(query builder) pelo o uso e melhor conpreenção da base de dados com query string, porem não o escolhi pois o gerenciamento mais completo do Sequelize nos deixa mas traquilo com a questão do gerenciamento da DB, ganhando assim mais performance na hora da criação.
Preparado para testesFoi usado jest como framework para realizar essa tarefa. Tanto para os unitários como para os de integração, Testando o aquivo de logica das funções responsáveis por faze a alocação, passando todas as rotas.
CLI integrationSequelize é uma mão na roda nesse contexto. migrações e seeders são feitos quase que sem nenhum problemas
LinterPara code styling foi usado eslint.
Banco de dados
Foi usado o banco de dados Sqlite tanto para a produção quanto para os testes.
Depois de criar um gitclone é só ultilizar o gerenciandor de pacotes de sua preverência.
npm install
yarn
Dessa forma ele irá instalar os pacotes necessários para qua a plicação funcione normalmete.
Obs: não é necessário fazer qualquer tipo de instação do banco de dados o Sqlite cria um arquivo dentro do projeto ultilizando o sequelize-cli(Explicarei a seguir..) Sequelize CLISerá necessário ter o sequelize-cli de forma global o como dependencia de desenvolvemento.
npm install --save-dev sequelize-cli
Mais informações aqui
Como informado foi ultilizado o jest para os tests unitário e de integração. Para rodar os testes local será necessário criar um arquivo com o nome deenvDatabase.js
na raiz do projeto, contendo essas informações
const test = {
dialect: "sqlite",
storage: "config/database/testes/testes.sqlite"
};
const prod = {
dialect: "sqlite",
storage: "config/database/database.sqlite"
};
module.exports = {
test,
prod
}
Em resumo...
Nome do Pacote | Finalidade | Link Documentação |
---|---|---|
Jest | Testes | Link |
Eslint | Irá olhar o seu código e vai te acusar os erros baseados na regra que você definir | Link |
Prettier | O Prettier é um code formatter livre (MIT) e de código aberto, que tem por finalidade "forçar" um padrão de código. | Link |
@hapi/joi | Joi: Esse pacote é usado para validar e retornar erros de validação de forma automatizada | Link |
Body-Parser | O body-parser é um módulo capaz de converter o body da requisição para vários formatos. Um desses formatos é json | Link |
cors | Cross-origin resource sharing (CORS ou compartilhamento de recursos de origem cruzada) é uma especificação de uma tecnologia de navegadores que define meios para um servidor permitir que seus recursos sejam acessados por uma página web de um domínio diferente | Link |
supertest | Basicamente o Supertest é um módulo que forja requisições visando testar webservers em Node. js e verifica o retorno das mesmas para automatizar testes deste tipo de infraestrutura, principalmente web APIs | Link |
Express.js | Express.js é um framework para aplicações web para Node.js, lançado como software livre e de código aberto sob a Licença MIT... | Link |
Obs: esses são os principais pacotes que foram ultilizados na construção do projeto e serão istalados automaticamente a partir do comando npm intall
Obs: A aplicação está disponível no heroku, dodos o endpoints podem ser testado aqui => https://apistorevideo.herokuapp.com
GET /movie - listar todos os filmes
GET /movie/{id} - listar um filme por ID
POST /movie - criar um filme
PUT /movie - atualizar um filme
DELETE /movie - excluir um filme
GET /rental - listar todas as locações
GET /rental/expire - listar locações com a data de devolução vencida
POST /rental - locar um filme
PUT /rental/devolve - devolver um filme
GET /movie
Retorna a lista dos filmes cadastrados
GET /movie{id}
Retorna o filme cadastrado passando a id como parâmetro
POST /movie
Cadastra o movie passando essas informações
Deve retornar essas informações
PUT /movie/{id}
Update dos filmes Obs: nessa rota você pode passar qualquer um dos campos que queira atualizar
Deve retornar essas informações
DELETE /movie/{id}
Deletar um filme passando o {id}
Deve retornar essas informações
POST /rental
Fazer um pedido de locação
Deve retornar essas informações
GET /rental
Retorna a lista de todas as locações criadas
GET /rental/expire
Retorna a lista de todas as locações com a data de inpiração atrasada
PUT /rental/devolve
Rota usada para devolver a locação passando o id com corpo da requisição Dessa forma
Crie na forma de função logica arquivo dentro da pasta api/rental/utils/logicFunction.js, esse arquivo é responsável pelo acoplamento das funções que são necessárias para :
FunçõesdeadLineReturn
Verifica a quantidade de filmes disponíveis, caso o numero de locação seja maior que a quantidade disponivel retorna um erro, caso esteja tudo ok elacria uma data de previsão de entrega em formato string para ser salva no banco
amountFunctionVerifica a quantidade de filmes disponíveis, caso o numero de locação seja maior que a quantidade disponivel retorna um erro, porem essa função subtrai a quantidade no banco de dados, ou seja caso tenha 10 ele queira fazer a locação de 2 no banco ele muda o valor de 10 para 8;
amountForRentalFunctionRetorna a quantidade de dias para devolver o filme, se o usuário locar de 1 retorna 1 caso 2 a 5 retorna 3 dias, caso 5 a 9 filmes ela retorna 5 dias caso 10 ou mais filmes ele retorna 10 dias
expiresFunctionEssa função é responsável para verificar o banco de dados e retornar as locações que estão em atraso, caso não tenha ele retorna uma mensagem
expiresOneFunctionVerifica se a locação esta ou não atrasada porem só lê uma entidade, é usada na rota put para retornar uma mensagem informando se a devolução está ou não em atraso.
arquivo .env.test
PORT=3000
DIALECT=sqlite
STORAGE=config/database/testes/testes.sqlite
NODE_ENV=test
arquivo .env
PORT=3000
PORT=3000
DIALECT=sqlite
STORAGE=config/database/database.sqlite
NODE_ENV=prod