API desenvolvida para fazer o controle de um database de uma Game Store.
Aplicação desenvolvida por Elias Forte.
A aplicação foi toda desenvolvida usando linguagem Javascript em Node.js utilizando o Express. Para validações do corpo das requisições foi usado o Joi. Validações de login dos usuários feita com o JsonWebToken. Foi utilizado MongoDB como database e MongoDB Atlas para o armazenamento em nuvem do database e utilizando o S3 do AWS para disponibilização em nuvem de arquivos.
Deploy da aplicação feita na plataforma gratuita de hospedagem Heroku.
Foram feitos teste de integração, usando as ferramentas Chai para fazer as asserções junto
com plug-in Chai-Http e o Mongo-Memory-Server, que respectivamente,
foram usados para realizar as requisições HTTP
para o servidor criado em memória. Com o Sion foram feitos os
mocks necessários.
Obs: teste em desenvolvimento
Todas as requisições devem ser feitas para a URL https://game-store-14.herokuapp.com/.
Para poder adicionar, editar, remover ou realizar comprar de jogos, o usuário tera que ser cadastrado no site, caso contrário, não conseguirá realizar essas ações.
O cadrastro deve ser feito por um requisição do tipo POST para o endpoint /register
, contendo as seguites informações:
{
"email": "[email protected]",
"password": "senhasenha",
"repeatPassword": "senhasenha"
}
Todos os campos são obrigatórios e deve ser informado um email válido para o cadastro ser concluído. Exemplos de erros que podem retornar:
Campo email não preenchido:
{
"message": "\"email\" is not allowed to be empty"
}
Email inválido:
{
"message": "\"email\" must be a valid email"
}
Usuario não cadastrado:
{
"message": "User not exist"
}
Registro realizado com sucesso: // retorno ainda não implementado
{
"massage": "User created successfully!"
}
O login do usuário deve ser feito em uma requisição do tipo POST para o endpoint /login
. Email e senha deve ser os mesmos utilizados
no registro e ambos os campos são obrigatórios. Após feito o login, o usuário tem acesso ao token de autenticação para poder criar, editar, remover ou comprar games.
Campo não preenchido:
{
"message": "\"password\" is not allowed to be empty"
}
Email ou senha inválidos:
{
"message": "Incorrect username or password"
}
Login realizado com sucesso:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Il9pZCI6IjYxYjgyNWJkNWVkYjU0ZGYwN2QyMDcwMSIsImVtYWlsIjoiZW1haWxAZW1haWwuY29tIn0sImlhdCI6MTYzOTQ1ODgwMCwiZXhwIjoxNjQwMDYzNjAwfQ.WYIeVRXq_AtG3QdZhVjregogHs2cXlBBLQ9P3hGu4Mk"
}
Para fazer a listagem de todos os jogos faça uma requisição do tipo GET para o endpoint /games
e o retorno dever ser um array
com todos os jogos disponíveis do banco, como por exemplo:
[
{
"_id": "61b7debf28efdadb9320a401",
"name": "Call of Duty",
"price": 3,
"quantity": 5,
"userId": "61b679f28c796346fe862884",
"image": "https://game-store-14.herokuapp.com/61b7debf28efdadb9320a401.jpeg"
},
{
"_id": "61b7df0d28efdadb9320a402",
"name": "God Of War",
"price": 3,
"quantity": 2,
"userId": "61b679f28c796346fe862884",
"image": "https://game-store-14.herokuapp.com/61b7df0d28efdadb9320a402.jpeg"
},
]
Para fazer a busca de um único game, deve ser feito uma requisição do tipo GET para o endpoint /games/:id
, informando o id do game.
Tendo o retorno da seguinte forma:
{
"_id": "61b80f079eeb9b77d9d03bfe",
"name": "Crash, Tag Team Racing",
"price": 3,
"quantity": 4,
"userId": "61b679f28c796346fe862884",
"image": "https://upload-game-store.s3.amazonaws.com/61b80f079eeb9b77d9d03bfe.jpeg"
}
Se o ID do game estiver no formato incorreto, exibe o retorno:
{
"message": "Invalid game ID"
}
Se o game não existir, exibe o retorno:
{
"message": "Game not exist"
}
Para criar um game, o usuário deve está logado com um token válido, fazendo uma requisição do tipo POST para o endpoint /games/register
.
Os campos name
, price
, quantity
são obrigatórios.
Campo vazio:
{
"message": "\"name\" is not allowed to be empty"
}
Usuário sem token:
{
"message": "Missing auth token",
"status": 401
}
Token inválido:
{
"message": "Jwt malformed"
}
Game criado com sucesso:
{
"message": "Successfully created game!"
}
Após criar o game na rota /games/register
, no database ele ficara desta forma:
{
"_id": "61b8e5dd1a0577e965f9818a",
"name": "Call Of Duty",
"price": 3,
"quantity": 7,
"userId": "61b825bd5edb54df07d20701"
}
Todo novo jogo é criado sem imagem. Para adicionar a imagem faça uma requisição do tipo POST para o endpoint /games/image/:id
.
O usuário deve está autenticado para fazer o upload da imagem, o ID
deve ser válido e o deve existir . É importante resaltar que o ID
da rota
/games/image/:id
, se refere ao ID
do novo game cadastrado no database. Faça uma nova requisição de listagem, para obter o ID
do game e envie
esse mesmo ID
na requisição POST para que a imagem seja alocada com o game certo. Após seguir esses passos, retornara da API a mensagem:
{
"message": "Upload completed successfully!"
}
No database ficara desta forma:
{
"_id": "61b8e5dd1a0577e965f9818a",
"name": "Call Of Duty",
"price": 3,
"quantity": 7,
"userId": "61b679f28c796346fe862884",
"image": "https://upload-game-store.s3.amazonaws.com/61b8e5dd1a0577e965f9818a.jpeg"
}
Se o ID do game estiver no formato incorreto, exibe o retorno:
{
"message": "Invalid game ID"
}
Se o game não existir, exibe o retorno:
{
"message": "Game not exist"
}
A atualização deve ser feita por uma requisição do tipo PUT para o endpoit /games/:id
. O usuário deve está autenticado para fazer a atualização,
o ID
deve ser válido e o jogo existir. O ID
do item a ser modificado, exemplo:
{
"_id": "61b8e5dd1a0577e965f9818a",
"name": "Call Of Duty",
"price": 3,
"quantity": 7,
"userId": "61b679f28c796346fe862884",
"image": "https://upload-game-store.s3.amazonaws.com/61b8e5dd1a0577e965f9818a.jpeg"
}
Enviando o "_id": "61b8e5dd1a0577e965f9818a"
na rota correta, o com o campo json { "name": "Need For Speed" }
, o retorno será:
{
"_id": "61b8e5dd1a0577e965f9818a"
"name": "Need For Speed",
"price": 3,
"quantity": 7,
"userId": "61b679f28c796346fe862884",
"image": "https://upload-game-store.s3.amazonaws.com/61b8e5dd1a0577e965f9818a.jpeg"
}
Aplicação permite somente remoção de um jogo por requisição. Para fazer a remoção, o usuário deve está autenticado, deve informar um ID
válido de um jogo que existe
no database. A requisição deve ser do tipo DELETE para o endpoint /games/:id
. A resposta da API sera um status code 204 No Content
.
Em casos de erros, podem sugir as seguintes retornos:
Se o ID do game estiver no formato incorreto, exibe o retorno:
{
"message": "Invalid game ID"
}
Se o game não existir, exibe o retorno:
{
"message": "Game not exist"
}
Usuário sem token:
{
"message": "Missing auth token",
"status": 401
}
Token inválido:
{
"message": "Jwt malformed"
}
Caso você queria fazer alguma contribuição, fique a vontade para comentar, fazer pull resquests. Toda ajuda a melhorar o código é bem vinda :D!