Esse é um projeto composto por dois sistemas backend
e frontend
que utilizam http rest
para troca de mensagens. O backend
é responsável por buscar um produto do banco de dados ou no site da drograria Drogasil. Já o frontend
é composto por apenas uma página com as informações do produto desejado. O backend
foi construído utilizando Clean Architecture
baseado em alguns Design Patters
, principalmente Dependency Inversion
. Já o frontend
busquei seguir as práticas que já seguia no Vue
, segmentei os componentes de forma coerente e implementei o cliente api rest
desaclopado da interface.
git clone https://github.com/lva98/Pill-Technical-Test
cd Pill-Technical-Test
docker-compose up
- Em um navegador acesse a página
localhost:5173?url=https://www.drogasil.com.br/sensodyne-creme-dental-medicinal-rapido-alivio-90g.html
. Caso deseje outro produto é só alterar o parâmetrourl
. - Ao acessar a página deverá informar as informações do produto
Sensodyne Creme Dental
. Caso algum erro aconteça será informado.
- Os testes no
frontend
são executados pelo Cypress. Foram implementados 3 testes de integração:Renders error when loaded withouth URL
,Renders a valid product
eRenders product not found
. Na página do projeto executepnpm cypress open
. No exemplo está sendo utilizadopnpm
mas pode ser qualquer outro de sua preferencia. - No
backend
foram implementados 4 testes unitários todos relacionados com o caso de usofind-a-product-by-url
, os testes são:Should use cache instead scraping a new product
,Should use scraping to find a pruduct and try to save
,Should throws product not found exception when neither repository nor cache are returning an invalid product
,Should throws invalid URL exception when URL is malformed
. Como visto, os testes nobackend
foram focados na execução de regras de negócio, na página do projeto executepnpm jest
.
GET /api/product?[url]
// Shape do objeto caso sucesso
interface Product {
name: string,
barcode: string,
pharmacyId: number
brand: string,
image: string,
price: number,
url: string
}
// Shape do objeto caso erro
interface Erro {
id: string, // Identificador do erro
type: number, // Camada do backend que o erro foi disparado
status: number, // Http status code
message: string // Mensagem de erro
}
- Backend better logging system
- Use sequelize migrations instead
.sync
- When scraping check if the product is on a deal
- Improve scraping to be more fast when product not found
- 404 page
- .env for Backend and Frontend
- Frontend component tests
- Eslint
- Make scraping module with async worker queue