O presente projeto foi desenvolvido utilizando Docker, adotando como linguagem de programação o Ruby on Rails, com o banco de dados PostgreSQL. Para os background jobs foram utilizados o Redis e Sidekiq. O objetivo final foi criar um MVP, ou seja, um produto minimamente viável que execute uma determinada tarefa pré-definida como prova de conceito. Foram gastas cerca de oito horas de trabalho no projeto.
Pry: Para depurar a aplicação. RSpec: Para a realização de testes Shoulda-Matchers: Para integrar nos testes com RSpec Simple Form For: Geração de formulários mais intuitivos. Nokogiri: Utilizado para ler os documentos anexados, realizando o scraping dos dados relevantes.
O objetivo do presente projeto é ser capaz de ler um arquivo .eml anexado, ler seu conteúdo filtrando por informações relevantes. O modelo utilizado como base para o código deste projeto foi:
>> email.eml
From: "[email protected]" <[email protected]>
Subject: Meu carro
To: "[email protected]" <[email protected]>
Cc:
Bcc:
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="--_=_NextPart5809_c2918dba-0af9-492b-bce0-190936b46673"
This is a multi-part message in MIME format.
----_=_NextPart5809_c2918dba-0af9-492b-bce0-190936b46673
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
phone: (31) 3003-4040
name: John Doe
vehicle: BMW 320i
price: 100.000
year: 2022
link: https://mg.olx.com.br/belo-horizonte-e-regiao/autos-e-pecas/carros-vans-e-utilitarios/bmw-320i-2013-2-0-16v-turbo-1171849286?lis=listing_2020
Estou procurando uma BMW 320i na faixa dos 100 a 200 mil.
----_=_NextPart5809_c2918dba-0af9-492b-bce0-190936b46673
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf-8"><p=
>phone: (31) 3003-4040</p><p>name: John Doe</p><p>vehicle: BMW 320i</p>=
<p>price: 100.000</p><p>year: 2022</p><p>link: https://mg.olx.com.br/belo-horizonte-e-regiao/autos-e-pecas/carros-vans-e-utilitarios/bmw-320i-2013-2-0-16v-turbo-1171849286?lis=listing_2020</p><p>Estou procurando uma BMW 320i na faixa dos 100 a 200 mil.</p><p><br></p>
----_=_NextPart5809_c2918dba-0af9-492b-bce0-190936b46673--
Uma vez que um arquivo .eml no formato acima tenha sido anexado na plataforma, o sistema chamará o leads_controller.rb
que será responsável por receber o arquivo anexado fazendo sua primeira leitura e armazenando seu conteúdo em uma variável.
Com a variável contendo os dados crus do arquivo anexado o job LeadGenerator.job
é chamado, sendo responsável pelo tratamento dos dados em background. Neste job, um Lead será criado e os dados serão raspados pela primeira vez, com o objetivo de se buscar o telefone, nome, veículo, preço, ano e link de um anúncio recebido e armazenado no arquivo anexado.
Tendo sido criado o leads_controller.rb
retornará com os dados e agora verificará os Leads existentes e se este possui um veículo vinculado a ele, não existindo o VehicleGeneratorJob
é chamado, iniciando um segundo trabalho em background que receberá o link armazenado na etapa de scraping do Lead, e então acessará a página web em busca das informações necessárias.
No caso em tela, foi utilizado um link do OLX escolhido aleatoriamente e disponível na data de 13 de abril de 2023.
Clique aqui para abrir o link do OLX (obs: o link poderá ficar indisponível). Abaixo é possível ver os dados que foram buscados da referida página web.
Ao realizar o scraping da página acima, os dados como modelo, marca, quilometragem e os itens opcionais são recebidos pelo VehicleGeneratorJob
que fica responsável por instanciar um novo veículo vinculado a um Lead já cadastrado cujo link foi objetivo em seu scraping, bem como instancia seus itens opcionais.
Não foi utilizada nenhum recurso para a criação de interfaces complexas dado a simplicidade do frontend, resumindo ao desenvolvimento básico com CSS.
Foi desenvolvida duas telas simples, a primeira e definida como "root" do projeto permite o upload de um arquivo ".eml". Uma vez anexado e tendo os dados sidos extraídos, o usuário é enviado para o dashboard onde pode ver os últimos resultados obtidos.
Não foi implementada a funcionalidade de login com Devise tampouco "policies" de autorização com Pundit, uma vez que o objetivo era realizar o processo de obtenção de dados de arquivos e páginas web. A implementação de autenticação pode ser visto em projetos como Real State API e autorização no Restaurants With Pundit
Para a execução correta do projeto, será necessário adicionar um arquivo .env com as seguintes chaves:
REDIS_URL_SIDEKIQ=redis://redis:6379/1
REDIS_HOST=redis
Lembre-se de adicionar no .gitignore o arquivo .env.
Este projeto roda com Docker. O arquivo docker-compose.yml
, contém todas as informações dos containers que irão subir com a aplicação, neste caso:
Banco de dados PostgreSQL
Redis
Sidekiq
Web (a aplicação)
Faça o clone do projeto , acesse a pasta e rode o comando docker-compose build
para que sejam rodados todos os comandos necessários tais como bundle install, yarn install, entre outros. Ao final, concluído o comando anterior rode o comando docker-compose up
para subir a aplicação.
Caso decida efetuar testes ("debugar") em tempo real na aplicação com o pry
, suba a aplicação com o comando docker-compose run --service-ports web
.
Acessar o terminal do rails: docker-compose run web rails c
Listar rotas: docker-compose run web rails routes -c "nome do controller"
Iniciar o projeto e containers: docker-compose build
Subir a aplicação: docker-compose up
BackgroundJobs
Sidekiq-background: Pequeno projeto testando e implementando background jobs.
Scraping
Viaggiare-Italia-API: Neste projeto foi realizado um scraping de dados públicos de cidades italianas e de repositórios de fotos no Unsplash. Clique aqui para visualizar.
Scraper Ruby: Pequeno projeto para testar o Nokogiri.
Mailing
Ruby Mailing: Projeto desenvolvido para testar a utilização do sistema de mailing com RoR.
Testes
E-Commerce-API: Aplicação desenvolvida com mais de 200 testes, inclusive de requests.
Frontend
Coffee Delivery: Aplicação de delivery desenvolvido com Styled Components.