Está é um sistema para avaliação de filmes, consumindo API pública do IMDB, e salvando avaliações e comentários em nossa DB. Utilizando uma segunda API para autenticação.
Neste projeto tem um docker-compose.yml, já com todas as imagens necessárias e com o start das duas APIs. Abaixo segue os passos para instalação. (caso opte por iniciar o servidor de desenvolvimento das APIs em separado, na pasta de cada API tem o passo-a-passo também)
também realizei o deploy básico das aplicações, caso queira testar:
API Principal (ifilmes - comentários e avaliações - a de auth está na porta 3000)
Observações:
-
As APIs já estão com os .env configurados para se comunicarem. Somente a API de autenticação armazena password da conta, a API principal de avaliações não armazena o password. A Autenticação é realizada na API de Autenticação, que retorna o token. Existe um Middleware na API de avaliações responsável por validar o token na API de Autenticação a cada requisição, invalidando a requisição caso não exista token ou esteja inválido (nas rotas autenticadas).
-
O Cache para tentativas de login está na API de Autenticação, responsável por enviar o erro após a 4ª tentativa.
-
No final deste readme deixei uma observação quanto à Collection do Insomnia, caso queira utilizar.
**Back-end: **
- Typescript
- Framework -> AdonisJS (NodeJs 14).
- DataBase -> MySQL (em Docker com Docker Compose).
- Cache -> Redis (em Docker com Docker Compose) - API de Auth.
Requisitos ->
- Portas 3333 e 3000 Liberadas.
- Docker (com Docker Compose).
- Git.
- Insomnia (ou Postman) para testes das rotas.
Primeiramente Clone o projeto
git clone https://github.com/ericalmeidasp/ifilmes-avaliacoes.git
Entre na pasta do raiz projeto
cd ifilmes-avaliacoes
Na pasta Raiz do projeto, Rode o Docker compose up para startar o MySQL, Redis e as duas APIs.
docker compose up -d
Após finalizar os containers e iniciar as aplicações (aguarde a DB estar pronta), Rode as Migrations na pasta raiz (a mesma que rodou o docker compose up) (já subi no git as variáves - .env - para facilitar, então, é só rodar :) - São 2 migrations, uma para cada API
docker exec app node ace migration:run
docker exec app-auth node ace migration:run
Rode os Seeders para os testes dos usuários: - São 2 seeders, um para cada API
docker exec app node ace db:seed
docker exec app-auth node ace db:seed
Agora é só começar os testes :)
- API Principal (ifilmes - comentários e avaliações)
- http://localhost:3333/
- API de Autenticação (auth-api) (caso queira testar separada, mas já está integrada na principal)
- http://localhost:3000/
Ok - LEITOR: Após o cadastro, esse usuário poderá logar e buscar por um filme. Ele poderá ver as informações de um filme, comentários e dar uma nota para o filme. A cada filme que o usuário avaliar, ele ganha 1 ponto em seu perfil.
Ok - BÁSICO: O usuário leitor poderá se tornar BÁSICO quando adquirir 20 pontos. Nesse perfil será possível postar comentários, notas e responder comentários. Cada resposta que o usuário enviar, ele ganha 1 ponto.
Ok - AVANÇADO: O usuário básico poderá se tornar AVANÇADO quando adquirir 100 pontos. Esse perfil tem as capacidades do BÁSICO, e mais citar outros comentários (comentários feitos por outros usuários) e marcar comentários como “gostei” ou "não gostei”.
Ok - MODERADOR: Um usuário poderá se tornar MODERADOR de 2 formas: um moderador torna outro usuário moderador ou por pontuação, para se tornar MODERADOR o usuário deverá ter 1000 pontos. O moderador tem as capacidades do AVANÇADO, e mais excluir um comentário ou marcar como repetida.
Ok - Um usuário não poderá logar sem ter feito um cadastro
Ok - Um usuário não poderá ver filmes e comentários e notas sem estar logado
Ok - Um usuário não poderá criar, editar ou excluir comentários e notas sem estar logado
Ok - Um usuário de um determinado perfil não poderá realizar ações que não fazem parte de seu perfil
Ok - Todas as funcionalidade de seu sistema devem receber um token de autenticação, gerados pela sua API de autorização
Ok - Um usuário não autenticado(que não possui o token) não poderá realizar ações no sistema.
Ok - Um usuário com token invalido não poderá realizar ações no sistema.
Ok - Todas as tentativas falhas de login devem ser salvas em um cache.
Ok - Caso um usuário tente 3 vezes logar e erre, na 4 vez deverá ser retornado uma mensagem de “limite de tentativas excedido “
Somente as duas primeiras rotas não são autenticadas (POST /user/register e POST /auth)
todas as demais são.
Com os Seeders, foram criados 4 usuários para testes no sistema, sendo:
- leitor@letscode.com.br -> password letscode
- basico@letscode.com.br -> password letscode
- avancado@letscode.com.br -> password letscode
- moderador@letscode.com.br -> password letscode
Parâmetro Header | Tipo parâmetro | Tipo dado | Descrição |
---|---|---|---|
Authorization |
Bearer |
string |
Obrigatório para rotas autenticadas. Utiliza o padrão => 'Bearer MTU.aKqvAG7GjM4m-5LBsINLnyKKv-NhPwDehSftqFDlCKW-YZ3WB-VhwRRh4aNa' |
ACL userLevel | Permissões |
---|---|
leitor |
Leitor |
basico |
Básico |
avancado |
Avançado |
moderador |
Moderador |
POST /user/register
- Rota não autenticada
- ACL: leitor,basico,avancado,moderador
Parâmetro | Tipo | Descrição |
---|---|---|
email |
string |
Obrigatório. email de cadastro |
name |
string |
Obrigatório. nome do usuário |
password |
string |
Obrigatório. senha |
passwordConfirmation |
string |
Obrigatório. confirmação da senha |
Retorno 201 Created
{
"email": "teste@letscode.com.br",
"name": "Éric Almeida",
"created_at": "2022-07-09T13:19:40.920+00:00",
"updated_at": "2022-07-09T13:19:40.920+00:00",
"id": 7
}
POST /auth
- Rota não autenticada
- ACL: leitor,basico,avancado,moderador
Parâmetro | Tipo | Descrição |
---|---|---|
email |
string |
Obrigatório. email do usuário |
password |
string |
Obrigatório. senha do usuário |
Retorno 200
{
"type": "bearer",
"token": "MTU.aKqvAG7GjM4m-5LBsINLnyKKv-NhPwDehSftqFDlCKW-YZ3WB-VhwRRh4aNa",
"expires_at": "2022-07-30T19:40:18.244-03:00"
}
DELETE /auth
- Rota Autenticada
- ACL: leitor,basico,avancado,moderador
Retorno 200
Upgrade do nível da conta (Leitor -> Basico -> Avançado -> Moderador) Por Pontos -> Retorna um objeto
PUT /user/upgrade
- Rota Autenticada
- ACL: leitor,basico,avancado,moderador
Retorno 200
{
"responseText": "Usuário não elegível para Upgrade, junte mais Pontos.",
"userPoints": 1
}
PUT /user/upgrade/mod
- Rota Autenticada
- ACL: moderador
Parâmetro | Tipo | Descrição |
---|---|---|
email |
string |
Obrigatório. Email do usuário a ser promovido |
Retorno 200
"Usuário promovido a moderador com sucesso";
Obtem Filmes da API IMDB e Salva os Filmes em nossa DB -> Retorna uma Array contendo os principais resultados.
POST /movies?searchString=string
- Rota Autenticada
- ACL: leitor,basico,avancado,moderador
Parâmetro | Tipo | Descrição |
---|---|---|
searchString |
string |
Obrigatório. Palavra para pesquisar os filmes |
Retorno 200
[
{
id: 1,
imdb_id: "tt0848228",
title: "The Avengers",
year: "2012",
poster:
"https://m.media-amazon.com/images/M/MV5BNDYxNjQyMjAtNTdiOS00NGYwLWFmNTAtNThmYjU5ZGI2YTI1XkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_SX300.jpg",
type: "movie",
comments: [],
myActiveRating: null,
movieRating: null,
},
];
GET /movies?searchString=string
- Rota Autenticada
- ACL: leitor,basico,avancado,moderador
Parâmetro | Tipo | Descrição |
---|---|---|
searchString |
string |
Obrigatório. Palavra para pesquisar os filmes |
Retorno 200
[
{
id: 1,
imdb_id: "tt0848228",
title: "The Avengers",
year: "2012",
poster:
"https://m.media-amazon.com/images/M/MV5BNDYxNjQyMjAtNTdiOS00NGYwLWFmNTAtNThmYjU5ZGI2YTI1XkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_SX300.jpg",
type: "movie",
comments: [
{
id: 1,
content: "Comentário 1",
movie_id: 1,
duplicated: 0,
created_at: "2022-07-01T00:55:02.000+00:00",
updated_at: "2022-07-01T00:55:14.000+00:00",
user: {
id: 4,
name: "Inara Lima",
email: "moderador@letscode.com.br",
},
wasQuoted: [],
replyComments: [
{
id: 2,
content: "respondi esse",
comment_id: 1,
created_at: "2022-07-01T00:55:51.000+00:00",
updated_at: "2022-07-01T00:55:51.000+00:00",
user: {
id: 4,
name: "Inara Lima",
email: "moderador@letscode.com.br",
},
},
],
likeCount: {
like: 1,
unLike: 0,
},
},
],
myActiveRating: 9,
movieRating: "9.00",
},
];
Pesquisa por Filme -> Retorna um objeto com as informações do filme pesquisado e todas informações referentes à ele (avaliações, comentarios, etc.).
GET /movies/:id
- Rota Autenticada
- ACL: leitor,basico,avancado,moderador
Parâmetro | Tipo | Descrição |
---|---|---|
:id |
string |
Obrigatório. Id do filme solicitado |
Retorno 200 OK || 400 BadRequest
{
id: 1,
imdb_id: "tt0848228",
title: "The Avengers",
year: "2012",
poster:
"https://m.media-amazon.com/images/M/MV5BNDYxNjQyMjAtNTdiOS00NGYwLWFmNTAtNThmYjU5ZGI2YTI1XkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_SX300.jpg",
type: "movie",
comments: [
{
id: 1,
content: "Comentário 1",
movie_id: 1,
duplicated: 0,
created_at: "2022-07-01T00:55:02.000+00:00",
updated_at: "2022-07-01T00:55:14.000+00:00",
user: {
id: 4,
name: "Inara Lima",
email: "moderador@letscode.com.br",
},
wasQuoted: [],
replyComments: [
{
id: 2,
content: "respondi esse",
comment_id: 1,
created_at: "2022-07-01T00:55:51.000+00:00",
updated_at: "2022-07-01T00:55:51.000+00:00",
user: {
id: 4,
name: "Inara Lima",
email: "moderador@letscode.com.br",
},
},
],
likeCount: {
like: 1,
unLike: 0,
},
},
],
myActiveRating: 9,
movieRating: "9.00",
}
PUT /rating
- Rota Autenticada
- ACL: leitor,basico,avancado,moderador
Parâmetro | Tipo | Descrição |
---|---|---|
movieId |
number |
Obrigatório. Id do filme |
value |
number |
Obrigatório. nota do filme |
Retorno 200 OK || 400 BadRequest
{
"id": 1,
"user_id": 4,
"movie_id": 1,
"value": 9,
"created_at": "2022-07-01T00:54:55.000+00:00",
"updated_at": "2022-07-01T00:54:55.000+00:00"
}
POST /comments
- Rota Autenticada
- ACL: basico,avancado,moderador
Parâmetro | Tipo | Descrição |
---|---|---|
movieId |
number |
Obrigatório. Id do filme a comentar |
content |
string |
Obrigatório. Comentario |
wasQuotedId |
number |
Opcional. Id do Comentario Mencionado (caso ele seja Avancado ou Moderador e queira mencionar algum |
Retorno 200 OK || 400 BadRequest
{
"movie_id": 1,
"content": "Comentário 1",
"created_at": "2022-07-01T01:11:27.931+00:00",
"updated_at": "2022-07-01T01:11:27.931+00:00",
"id": 2,
"user": {
"id": 4,
"name": "Inara Lima",
"email": "moderador@letscode.com.br"
},
"wasQuoted": [],
"likeCount": {
"like": 0,
"unLike": 0
}
}
PUT /comments/:id
- Rota Autenticada
- ACL: moderador
Parâmetro | Tipo | Descrição |
---|---|---|
:id |
number |
Obrigatório. Id do comentário à sinalizar como repetido |
Retorno 200 OK || 400 BadRequest
{
"id": 1,
"content": "Comentário 1",
"movie_id": 1,
"duplicated": true,
"created_at": "2022-07-01T00:55:02.000+00:00",
"updated_at": "2022-07-01T01:12:02.858+00:00",
"likeCount": {
"like": 0,
"unLike": 0
}
}
DELETE /comments/:id
- Rota Autenticada
- ACL: moderador
Parâmetro | Tipo | Descrição |
---|---|---|
:id |
number |
Obrigatório. Id do comentário à sinalizar como repetido |
Retorno 200 OK || 400 BadRequest
"Comentário Apagado com Sucesso";
PUT /reactions
- Rota Autenticada
- ACL: avancado,moderador
Parâmetro | Tipo | Descrição |
---|---|---|
commentId |
number |
Obrigatório. Id do comentário à Reagir |
type |
enu('like','unlike') |
Obrigatório. Reação ao comentário |
Retorno 200 OK || 400 BadRequest
{
"comment_id": 2,
"type": "like",
"id": 2
}
POST /repliescomments
- Rota Autenticada
- ACL: basico,avancado,moderador
Parâmetro | Tipo | Descrição |
---|---|---|
commentId |
number |
Obrigatório. Id do comentário à responder |
content |
string |
Obrigatório. Texto da resposta |
Retorno 200 OK || 400 BadRequest
{
"comment_id": 2,
"content": "respondi esse",
"created_at": "2022-07-01T01:14:23.777+00:00",
"updated_at": "2022-07-01T01:14:23.777+00:00",
"id": 3,
"user": {
"id": 4,
"name": "Inara Lima",
"email": "moderador@letscode.com.br"
}
}
DELETE /repliescomments/:id
- Rota Autenticada
- ACL: moderador
Parâmetro | Tipo | Descrição |
---|---|---|
:id |
number |
Obrigatório. Id da resposta do comentário à apagar |
Retorno 200 OK || 400 BadRequest
"Comentário Apagado com Sucesso";
Inclui aqui na pasta raiz, um arquivo Json do Insomnia, caso queira facilitar as criações das rotas para os testes. nele já está o Header Authorization automático com a resposta do login, e tem todas as rotas com os dados necessários.
Insomnia_API-iFilmes.json
Para incluir, é só ir em -> Preferences -> Data -> Import Data -> From File, e selecionar o arquivo json.
Desde já, fica meu muito obrigado por essa oportunidade íncrivel. Foi um projeto sensacional, que trouxe muitos aprendizados, parabéns aos envolvidos. e mais uma vez obrigado à toda equipe da LetsCode e ao Banco por conduzir esse processo gigante de maneira incrível e organizada.