- Criação de usuários
- Logon e logoff de usuários
- Cadastro de filmes
- Listagem de filmes disponíveis
- Pesquisa de filmes pelo título
- Locação de filmes
- Devolução de filmes
- Redis
Responsável por controle e armazenamento de tokens gerados para usuários cadastrados.
# Atualize seu cache de pacotes do Linux
$ sudo apt update
# Instale o Redis
$ sudo apt install redis
# Instale o Redis-Server
$ sudo apt install redis-server
Para rodar o Redis em ambiente Windows faça o download do arquivo Redis-x64-3.0.504.zip
nesse repositório.
- MySQL
Responsável por armezanar dados da aplicação referentes às informações de usuários e filmes.
Script do banco de dados
CREATE DATABASE 4all-backend-challenge;
Script da tabela de usuários
CREATE TABLE users (
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
Script da tabela de filmes
CREATE TABLE movies (
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
director VARCHAR(255) NOT NULL,
quantity INTEGER NOT NULL
);
# Clone o repositório
$ git clone https://github.com/cassiocappellari/4all-backend-challenge.git
# Entre na pasta
$ cd 4all-backend-challenge
# Instale as dependências
$ npm install
# Inicie o projeto
$ npm start
Basta clicar no botão abaixo para testar localmente as rotas do sistema através do aplicativo Insomnia:
- Nas rotas abaixo não há necessidade de token para acessá-las;
- As duas rotas fornecem, como retorno da requisição, um token de acesso à todas rotas privadas.
rota | método HTTP | parâmetros | descrição |
---|---|---|---|
/user/signup |
POST | Request body com name , email e password |
Cadastra o usuário no banco de dados com password encriptado e retorna token de acesso à rotas privadas |
/user/logon |
POST | Request body com email e password |
Loga o usuário no sistema mediante validação de password e retorna token de acesso à rotas privadas |
Exemplos de requisições
- POST:
/user/signup
Entrada:
{
"name": "Cássio Cappellari",
"email": "cassiocappellari@gmail.com",
"password": "123456"
}
Saída:
{
"userSignUpStatus": "user successfully created",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwianRpIjoxLCJpYXQiOjE2MTA5MTQ5NTYsImV4cCI6MTYxMDkxODU1Nn0.gh-qfLHAvgg7g2nBjJXGHgtq_P6sx26FxUaU4LDquus"
}
- POST:
/user/logon
Entrada:
{
"email": "cassiocappellari@gmail.com",
"password": "123456"
}
Saída:
{
"userAuthenticationStatus": "user successfuly logged in",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MjAsImp0aSI6MjAsImlhdCI6MTYxMDkxMzAyNSwiZXhwIjoxNjEwOTE2NjI1fQ.8XJjKqgDThgEHsY5nr92C1WGpjhbk57vnL7SCrtLAPM"
}
- As rotas abaixo somente podem ser acessadas mediante
JWT token
gerado nas rotas/user/signup
ou/user/logon
; - O token deve ser inserido no request header authorization da requisição desejada;
- O token de acesso tem duração de 60 minutos a partir do momento em que é gerado.
rota | método HTTP | parâmetros | descrição |
---|---|---|---|
/user/logoff |
GET | Request header authorization com Bearer + JWT token |
Invalida o token de acesso do usuário |
/movie/create |
POST | Request body com title , director e quantity |
Cadastra um novo filme no banco de dados |
/movie/available |
GET | - | Lista todos os filmes do banco de dados disponíveis para aluguel |
/movie/filter |
GET | Query parameter com title + nome do filme |
Retorna o filme de acordo com o título informado |
/movie/rent/:id |
PUT | Query parameter com id do filme que será alugado |
Aluga o filme caso disponível |
/movie/return/:id |
PUT | Query parameter com id do filme que será devolvido |
Devolve o filme alugado |
Exemplos de requisições
- GET:
/user/logoff
Entrada:
{
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MjAsImp0aSI6MjAsImlhdCI6MTYxMDkxMzAyNSwiZXhwIjoxNjEwOTE2NjI1fQ.8XJjKqgDThgEHsY5nr92C1WGpjhbk57vnL7SCrtLAPM
}
Saída:
{
"userTokenStatus": "user successfuly logged out"
}
- POST:
/movie/create
Entrada:
{
"title": "Gangues de Nova York",
"director": "Martin Scorsese",
"quantity": 4
}
Saída:
{
"createMovieStatus": "movie successfully created"
}
- GET:
/movie/available
A rota de listar filmes disponíveis não apresenta aqueles cujo campo quantity
é igual a 0.
Saída:
[
{
"id": 1,
"title": "Jurassic Park",
"director": "Steven Spielberg",
"quantity": 2
},
{
"id": 2,
"title": "Guerra dos Mundos",
"director": "Steven Spielberg",
"quantity": 3
},
{
"id": 3,
"title": "Pulp Fiction",
"director": "Quentin Tarantino",
"quantity": 3
},
{
"id": 4,
"title": "Era uma Vez em Hollywood",
"director": "Quentin Tarantino",
"quantity": 3
},
{
"id": 5,
"title": "O Lobo de Wall Street",
"director": "Martin Scorsese",
"quantity": 2
},
{
"id": 6,
"title": "Gangues de Nova York",
"director": "Martin Scorsese",
"quantity": 4
}
]
- GET:
/movie/filter
Entrada:
http://localhost:3000/movie/filter?title=Jurassic%20Park
Saída:
[
{
"id": 1,
"title": "Jurassic Park",
"director": "Steven Spielberg",
"quantity": 2
}
]
- PUT:
/movie/rent/:id
A rota de alugar filmes verifica a quantidade de cópias do filme desejado e subtrai 1 do valor do campo quantity
caso esteja disponível para aluguel.
Entrada:
http://localhost:3000/movie/rent/1
Saída:
{
"rentMovieStatus": "movie rented successfuly"
}
- PUT:
/movie/return/:id
A rota de devolver filmes soma 1 ao valor do campo quantity
do filme que será devolvido.
Entrada:
http://localhost:3000/movie/return/1
Saída:
{
"returnMovieStatus": "movie returned successfuly"
}
Cássio Cappellari
- GitHub: @cassiocappellari
- LinkedIn: @cassiocappellari
Developed with 💚 by Cássio Cappellari!