Este web crawler foi desenvolvido com o objetivo de fazer a busca de frases que contenham uma determinada tag que é passada como parametro para a rota responsável por retornar os resultados da busca.
Ao se fazer uma chamada à rota /quotes/:search_tag é feita uma chamada ao método tag do controller que por sua vez faz uma chamada ao metodo getQuotes, passando como parametro a tag.
Quando a execução chega ao metodo getQuotes o mesmo verifica se a tag já foi buscada, caso não haja registro de busca prévia faz a busca no site e retorna as quotes encontradas para a tag buscada, adicionando-as ao cache, porém se já houver ocorrido busca por aquele termo faz a busca no cache e retona o resultado.
Se o resultado da busca no cache não retornar nenhuma frase executa novamente a busca no site, retornando como resultado as quotes encontradas ou um array vazio caso não haja nenhuma quote com a tag desejada.
Há também um serviço que roda de forma assíncrona em paralelo com a execução principal da aplicação que executa um job agendado via sidekiq-cron em combinação com o cache server Redis. Este job será realizado a cada 12 horas pelo servidor sidekiq, que carrega e executa todas as tarefas agendadas e salvas no Redis.
Abaixo segue um guia para que você possa executar e testar esta aplicação passo a passo, cobrindo desde o setup inicial ao uso da mesma.
Para a configuração do ambiente de execução serão necessarias as seguintes dependencias:
-
Ruby 3.0.3
-
MongoDB
-
Redis
Apoś a instalacação das dependencias citadas acima, siga os seguintes passos:
-
Clonar o repositorio ou fazer download do codigo fonte.
git clone https://github.com/ljnferreira/QuotesWebCrawler.git
ou
gh repo clone ljnferreira/QuotesWebCrawler -
Navege a seguir ate o diretorio do projeto:
cd QuotesWebCrawler
-
Instale as dependencias
bundle install
-
Inicie o serviço do banco de dados:
No linux:systemctl start mongodb.service
Caso queira que ele se inicie junto com o sistema, execute antes:
systemctl enable mongodb.service
-
Inicie o serviço do cache (Redis):
No linux:systemctl start redis.service
Caso queira que ele se inicie junto com o sistema, execute antes:
systemctl enable redis.service
-
Execute o seguinte comando para criar os primeiros usuarios do sistema:
rake db:seed
-
Inicie o serviço:
- Para servir somente no localhost
rails s
- Para servir em todas as maquinas da rede
rails s --binding=0.0.0.0
- Para iniciar em uma porta diferente
rails s -p <porta>
- Para iniciar em uma porta diferente e servir para todas as maquinas com acesso a rede:
rails s -p <porta> --binding=0.0.0.0
- Para servir somente no localhost
Ao inicializar o servidor rails o mesmo irá agendar no cache Redis uma tarefa que será executada a cada 12 horas, atualizando o cache com as quotes já pesquisadas verificando para atualizações.
-
Para permitir que essas tarefas sejam executadas é necessário que se inicialize o serviço do Sidekiq, rodando o seguinte comando em outra janela ou aba do terminal:
bundle exec sidekiq
Esta API utiliza-se de autenticação via JWT, e algumas rotas são também protegidas por autorização, portanto, o primeiro passo é se autenticar através da rota /user_token.
Para facilitar o uso e testes criei uma pasta /postman no projeto que contem todas as colections de requests de API pre configuradas, bastando nas rotas autenticadas adicionar o token obtido da rota /user_token.
O login via rota /user_token pode ser feito enviando um json no body de uma requisição POST no seguinte formato:
{
"auth":{
"email": "[email protected]",
"password": "fancyPassword"
}
}
Que retornará uma resposta no seguinte formato caso o usuario exista e tenha sido possivel realizar login:
{
"jwt": "ultraFancyAndSecureAndAwesomeJWT-Token"
}
Para saber quais usuários existem inicialmente após o setup do sistema basta abrir o arquivo /db/seeds.rb na pasta inicial do projeto.
Esta API possui somente uma unica rota aberta a todos os usuários autenticados ( /quotes/:search_tag ) que retorna todas as quotes que contem uma determinada tag, e retorna um JSON no seguinte formato:
{
"quotes": [
{
"quote": "frase",
"author": "nome do autor",
"author_about": "link para o perfil do autor",
"tags": ["tag1", "tag2"]
},
{
"quote": "frase 2",
"author": "nome do autor 2",
"author_about": "link para o perfil do autor 2",
"tags": ["tag1", "tag2"]
},
]
}
Desde que o usuario esteja autenticado.
Também existem rotas de administrador, que somente usarios do tipo admin podem acessar, e permitem obter algumas informações sobre o cache. Estando logado como admin as rotas disponiveis são:
-
/cache/saved
-
/cache/searched
-
/cache/clean
Que retornam respectivamente os seguintes JSON:
-
/cache/saved
{ "cached_quotes": [ { "author": "autor", "author_about": "link para o perfil do autor", "quote": "“Frase”", "tags": [ "edison", "failure", "inspirational", "paraphrased" ] }, { "author": "autor", "author_about": "link para o perfil do autor", "quote": "“Frase”", "tags": [ "life", "love" ] } ] }
-
/cache/searched
{ "searched_tags": [ { "tag": "failure" }, { "tag": "love" } ] }
-
/cache/clean
{ "tags_deleted": 2, "quotes_deleted": 2 }
-
Para criar um novo usuario basta enviar uma chamada POST para a rota /users/create que com o seguinte body:
{
"user": {
"email" : "[email protected]",
"password": "fancypassword",
"password_confirmation": "fancypassword",
"username": "<First Name> <Last Name>",
"role": "admin" //optional, case null default is 'user'
}
}
Em caso de sucesso a api retornará o seguinte objeto JSON:
{
"status": 200,
"msg": "User was created."
}
Caso surjam dúvidas ou sugestões ao fim deste tutorial favor abrir uma issue no projeto ou, caso prefira, entre em contato via [email protected].