Não existe a necessidade de inicializar a base de dados, a aplicação utiliza como host de banco de dados o site mLab, neste site é possível
hospedar instâncias de banco de dados mongo, portanto foram criadas 3 instâncias, quotes, quotes_test e quotes_prod.
Se precisar acessar o banco de dados para algum tipo de validação, os dados de conexão podem ser encontrados aqui.
Não é preciso executar os testes localmente, para desenvolver esta aplicação utilizei o servidor de integração contínua Travis.CI, este servidor disponibiliza um relatório de construção do projeto que pode ser acessado através do seguinte link Last Build.
Mas sendo necessário executar os testes localmente execute os seguintes passos:
git clone https://github.com/ronniery/crawler.rails.gitcd crawler.railsbundle installrake testrake test:systempara testes de sistema
Também não se faz necessário executar a aplicação localmente devido a forma que o projeto foi costruído, juntamente com o Travis.CI foi utilizado o servidor Heroku para hospedar a aplicação após o build, o resultado da integração pode ser acessado atráves do seguinte link.
Mas sendo necessário subir a aplicação localmente execute os seguintes passos:
git clone https://github.com/ronniery/crawler.rails.gitcd crawler.railsbundle installrails server -e [production | development](Escolha um modo de execução do projeto)
Optei por criar um servidor em ruby on rails, com isso já teria um 'scaffold' de aplicação que iria me dar agilidade.
A aplicação possui as seguintes rotas:
| Prefixo | Método | URI | Controlador/Ação | Descrição | Seguro |
|---|---|---|---|---|---|
root |
GET | / | main#index | Rota base do app | ✗ |
create |
POST | /create | main#create | Rota para criação de tokens de acesso | ✗ |
quotes |
GET | /quotes | quotes#show | Rota base do controllador quotes | ✓ |
| - | GET | /quotes/:tag | quotes#show | Exibe JSON bruto no navegador da tag informada | ✓ |
| - | GET | /quotes/:tag/:mode | quotes#viewer | Exibe o JSON em um editor amigável da tag informada | ✓ |
Representação em BPM do fluxo necessário para se obter um token:
Algumas rotas vão exigir que você informe um token de acesso através do parâmetro ?t={USER_TOKEN} ou através do header Authorization,
vejamos um exemplo:
https://arcane-waters-62201.herokuapp.com/quotes/{SEARCH_TERM}?t={USER_TOKEN}
Ou
$.ajax({
method: 'GET'
headers: {
'Authorization: Beaer {USER_TOKEN} //Não esquecer de adicionar `Bearer`
},
{...more options}
})
O token é válido por 2 horas.
obs: A arquitetura da aplicação foi feita desta forma, unicamente para fins avaliativos, considerando que não existem rotas que não sejam GET
onde o header com a autorização faria mais sentido.
Representação em BPM do fluxo necessário para realizar uma busca por um determinado termo:
Descrição do fluxo previamente mapeado:
- O controlador base
application_controllerrealiza a verificação da requisição recebida por todo controlador que herda diretamente do controlador já citado e que não especifica a flagskip_before_action :check_auth, como já acontece no controladormain_controllerverificando se a requisição possui o token de acesso, cabeçalho ou na url.- Se possuir o token e ele sendo válido a requisição irá ser continuada pelo controlador
quotes_controller#quotes/:tag. - Ao dar continuidade a uma requisição nesta url o controlador
quoteserá verificado se existe um cache salvo no banco de dados para a tag informada.- Se não existir uma requisição será feita a url
http://quotes.toscrape.com/tag/{SEARCH_TERM/:tag}/. - Logo após receber a resposta do servidor o módulo
crawlerirá realizando o parse do html recebido, salvando cada nova quote dentro do db.
- Se não existir uma requisição será feita a url
- Se existir o controlador irá retornar a lista com todas as quotes obtidas diretamente do bd. (Indo para a última etapa do processo)
- Se possuir o token e ele sendo válido a requisição irá ser continuada pelo controlador
- Conluindo a operação de parse de todo o HTML, será retornada uma lista com todas as quotes obtidas, retornando para o controlador
quotes_controller. - Para finalizar o controlador
quoteretornará ao usuário o JSON com todas as quotes encontradas.

