Skip to content

carlosrjr/crawler-quotes

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Crawler Quotes

Este crawler faz o scrape em http://quotes.toscrape.com para obter frases a partir de tags informadas na consulta.

1. Tecnologias Utilizadas

Para desenvolver esta solução, foi utilizado:

  • Ruby 2.7.3p183
  • Rails 5.0.7.2
  • Mongodb 4.2.15

2. Como executa o projeto

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

3. API Endpoints

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

4. Status code

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.

5. Autenticação

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.

Endpoint: POST /auth/signup

Para cadastrar um usuário, deve informar um username e um password no formato JSON na requisição.

Request

{
  "username": "administrador",
  "password": "123456"
}

Response

{
  "status_code": 200,
  "message": "Usuário criado com sucesso."
}

Errors

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."
}

Endpoint: POST /auth/signin

Para realizar o login de um usuário, deve informar um username e um password no formato JSON na requisição.

Request

{
  "username": "administrador",
  "password": "123456"
}

Response

{
  "username": "administrador",
  "jwt": {
    "prefix": "Bearer",
    "encodedToken": "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluaXN0cmFkb3IiLCJkYXRlX2FjY2VzcyI6IjIwMjEtMDktMDZUMjE6NDM6MjItMDM6MDAifQ.e59ZQ0_18bUPsuLkMaXBZ96LN_mJ7OvPw7ukyHNc3N0",
    "date_access": "2021-09-06T21:43:22.677-03:00"
  }
}

Errors

Quando o username ou password são inválidos:

{
  "status_code": 401,
  "message": "Acesso não autorizado."
}

6. Consultas

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.

Endpoint: GET /quotes

Lista todos os quotes armazenos no bando de dados.

Response

{
  "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"
      ]
    }
  ]
}

Endpoint: GET /quotes/:tag

Lista os quotes filtrando pela tag. Se a tag ainda não existir no banco, faz o scrape.

Response

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"
      ]
    }
  ]
}

Endpoint: GET /tags

Lista todas as tags cadastradas no banco de dados.

Response

{
  "tags": [
    {
      "title": "death",
      "register_date": "2021-09-06T22:56:48-03:00"
    },
    {
      "title": "travel",
      "register_date": "2021-09-06T22:58:27-03:00"
    }
  ]
}

Endpoint: GET /tags/:tag

Exibe uma tag cadastrada no banco de dados, caso ela exista.

Response

Utilizando o endpoint /tags/travel

{
  "tags": [
    {
      "title": "travel",
      "register_date": "2021-09-06T22:58:27-03:00"
    }
  ]
}

Errors

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."
}

7. Clean

Nesta sessão será mostrado o funcionamento dos métodos para apagar as informações no banco de dados.

Endpoint: DELETE /tags/:tag

Remove uma tag que esteja registrada no banco de dados.

Response

Utilizando o endpoint /tags/travel

{
  "status_code": 200,
  "message": "A tag 'travel' foi removida."
}

Errors

Utilizando o endpoint /tags/unknown

{
  "status_code": 404,
  "message": "A tag 'unknown' não foi encontrada."
}

Endpoint: DELETE /clean/quotes

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.

Response

{
  "status_code": 200,
  "message": "Todos os quotes e tags foram removidos."
}

Endpoint: DELETE /clean/tags

Limpa todas as tags cadastradas no banco de dados. Este endpoint não remove os quotes cadastrados.

Response

{
  "status_code": 200,
  "message": "Todas as tags foram removidas."
}

Endpoint: DELETE /auth/remove

Remove um usuário cadastrado. Para remover um usuário, deve informar um username e um password no formato JSON na requisição.

Request

{
  "username": "administrador",
  "password": "123456"
}

Response

{
  "status_code": 200,
  "message": "Usuário 'administrador' foi removido."
}

Errors

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."
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published