Este crawler faz o scrape em http://quotes.toscrape.com para obter frases a partir de tags informadas na consulta.
Para desenvolver esta solução, foi utilizado:
- Ruby 2.7.3p183
- Rails 5.0.7.2
- Mongodb 4.2.15
Para executar este projeto, é necessario que as dependencias do projeto estejam instaladas e os serviços estejam ativos.
-
Instale as dependencias do projeto.
~$ bundle install
-
Para iniciar o serviço do MongoDB, execute:
~$ sudo systemctl start mongod
-
Verifique se o serviço do mongo está ativo:
~$ systemctl status mongod
-
Inicie o servidor local rails
~$ rails s
HTTP Method | Description | Path |
POST | Cria um novo usuário. | /auth/signup |
POST | Realiza o login de um usuário cadastrado para obter um token de acesso. | /auth/signin |
GET | Lista todos os quotes armazenos no bando de dados. | /quotes |
GET | Lista os quotes filtrando pela tag. Se a tag ainda não existir no banco, faz o scrape. | /quotes/:tag |
GET | Lista todas as tags cadastradas no banco de dados. | /tags |
GET | Exibe uma tag cadastrada no banco de dados, caso ela exista. | /tags/:tag |
DELETE | Remove uma tag que esteja registrada no banco de dados. | /tags/:tag |
DELETE | Limpa todos os quotes e tags cadastrados no banco de dados. | /clean/quotes |
DELETE | Limpa todas as tags cadastradas no banco de dados. | /clean/tags |
DELETE | Remove um usuário cadastrado. | /auth/remove |
Code | Status | Description |
200 | OK | Indica que a requição teve sucesso. |
400 | Bad Request | Indica que o formato da requisição não esta correto ou os dados estão incorretos. |
401 | Unauthorized | Indica que o usuário não tem autorização para ter acesso ou está utilizando um token inválido. |
404 | Not Found | Indica que não foi encontrado um resultado para a pesquisa. |
Para utilizar os endpoints, é necessário possuir um usuário cadastrado para realizar login e obter o token JWT para que o acesso seja permitido.
Para cadastrar um usuário, deve informar um username e um password no formato JSON na requisição.
{
"username": "administrador",
"password": "123456"
}
{
"status_code": 200,
"message": "Usuário criado com sucesso."
}
Quando já existe um usuário com o mesmo username cadastrado:
{
"status_code": 400,
"message": "Usuário já existe."
}
Quando o username ou password possuem menos de 6 caracteres:
{
"status_code": 401,
"message": "Os campos 'username' e 'password' devem ter no mínimo 6 caracteres."
}
Para realizar o login de um usuário, deve informar um username e um password no formato JSON na requisição.
{
"username": "administrador",
"password": "123456"
}
{
"username": "administrador",
"jwt": {
"prefix": "Bearer",
"encodedToken": "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluaXN0cmFkb3IiLCJkYXRlX2FjY2VzcyI6IjIwMjEtMDktMDZUMjE6NDM6MjItMDM6MDAifQ.e59ZQ0_18bUPsuLkMaXBZ96LN_mJ7OvPw7ukyHNc3N0",
"date_access": "2021-09-06T21:43:22.677-03:00"
}
}
Quando o username ou password são inválidos:
{
"status_code": 401,
"message": "Acesso não autorizado."
}
Esta sessão é distinada a mostrar como funciona as consultas na API. Para ter acesso, é preciso realizar o login antes para obter o token JWT e adicioná-lo nas requisições. Para fazer isso via Postman, você pode selecionar a aba Authorization, selecine o type Bearer Token e adicione o token, ou envie o token no header da requisição.
Lista todos os quotes armazenos no bando de dados.
{
"quotes": [
{
"quote": "“To the well-organized mind, death is but the next great adventure.”",
"author": "J.K. Rowling",
"author_about": "http://quotes.toscrape.com/author/J-K-Rowling",
"tags": [
"death",
"inspirational"
]
},
{
"quote": "“The fear of death follows from the fear of life. A man who lives fully is prepared to die at any time.”",
"author": "Mark Twain",
"author_about": "http://quotes.toscrape.com/author/Mark-Twain",
"tags": [
"death",
"life"
]
},
{
"quote": "“I'm the one that's got to die when it's time for me to die, so let me live my life the way I want to.”",
"author": "Jimi Hendrix",
"author_about": "http://quotes.toscrape.com/author/Jimi-Hendrix",
"tags": [
"death",
"life"
]
},
{
"quote": "“Not all those who wander are lost.”",
"author": "J.R.R. Tolkien",
"author_about": "http://quotes.toscrape.com/author/J-R-R-Tolkien",
"tags": [
"bilbo",
"journey",
"lost",
"quest",
"travel",
"wander"
]
}
]
}
Lista os quotes filtrando pela tag. Se a tag ainda não existir no banco, faz o scrape.
Utilizando o endpoint /quotes/travel
{
"quotes": [
{
"quote": "“Not all those who wander are lost.”",
"author": "J.R.R. Tolkien",
"author_about": "http://quotes.toscrape.com/author/J-R-R-Tolkien",
"tags": [
"bilbo",
"journey",
"lost",
"quest",
"travel",
"wander"
]
}
]
}
Lista todas as tags cadastradas no banco de dados.
{
"tags": [
{
"title": "death",
"register_date": "2021-09-06T22:56:48-03:00"
},
{
"title": "travel",
"register_date": "2021-09-06T22:58:27-03:00"
}
]
}
Exibe uma tag cadastrada no banco de dados, caso ela exista.
Utilizando o endpoint /tags/travel
{
"tags": [
{
"title": "travel",
"register_date": "2021-09-06T22:58:27-03:00"
}
]
}
Caso não exista, será retornado um erro Not Found dizendo que a tag não foi encontrada no banco de dados.
Utilizando o endpoint /tags/unknown
{
"status_code": 404,
"message": "A tag 'unknown' não foi encontrada."
}
Nesta sessão será mostrado o funcionamento dos métodos para apagar as informações no banco de dados.
Remove uma tag que esteja registrada no banco de dados.
Utilizando o endpoint /tags/travel
{
"status_code": 200,
"message": "A tag 'travel' foi removida."
}
Utilizando o endpoint /tags/unknown
{
"status_code": 404,
"message": "A tag 'unknown' não foi encontrada."
}
Limpa todos os quotes e tags cadastrados no banco de dados. Apagar as tags é necessário, pois quando for feita uma nova consulta, não haverá cache dos cotes e não será possível fazer um novo scrape, caso as tags estejam registradas no banco de dados.
{
"status_code": 200,
"message": "Todos os quotes e tags foram removidos."
}
Limpa todas as tags cadastradas no banco de dados. Este endpoint não remove os quotes cadastrados.
{
"status_code": 200,
"message": "Todas as tags foram removidas."
}
Remove um usuário cadastrado. Para remover um usuário, deve informar um username e um password no formato JSON na requisição.
{
"username": "administrador",
"password": "123456"
}
{
"status_code": 200,
"message": "Usuário 'administrador' foi removido."
}
Caso o username não seja encontrado no banco de dados.
{
"status_code": 404,
"message": "O usuário 'administrador' não foi encontrado."
}
Caso o password esteja incorreto.
{
"status_code": 401,
"message": "Acesso não autorizado."
}