logo

Aplicação para um teste da Shopper.

📜 Sumário

  1. Detalhes do projeto
  2. Tecnologias usadas
  3. Para rodar o projeto
  4. Documentação
  5. Visual
  6. Autor

1. 🔍 Detalhes do projeto

O projeto foi realizado como um teste para uma vaga de Dev Junior na Shopper. A proposta era construir uma ferramenta que permita atualizar os produtos de forma massiva e com recursos adicionais para evitar erros que possam prejudicar o negócio.

Cenário:

Regras de negócio:

  • Atualização por meio de arquivo .csv com código do produto e novo preço;
  • Impossibilidade de reajuste de valor para preço abaixo do custo;
  • Impossibilidade de reajuste maior ou menor do que 10% do preço atual do produto;
  • Alguns produtos são vendidos em pacotes, ou seja, um produto que é composto por um ou mais produtos em quantidades diferentes. Neste caso, ao reajustar o preço de um produto ou pacote, deve-se realizar também o reajuste do contexto (o preço da soma dos componentes é igual ao preço do pacote), validando as regras já citadas.

Outros requisitos:

  • Sistema deve permitir o carregamento de um arquivo .csv;
  • Deve possuir um botão que leva à validação;
  • Ao final da validação o sistema deve exibir as informações dos produtos que foram enviados (Codigo, Nome, Preço Atual, Novo Preço), bem como a regra quebrada, caso não tenha passado em alguma validação;
  • Se todas as validações tiverem sucesso, deve possibilitar um botão para atualizar os preços;
  • Ao clicar em atualizar, deve retornar para tela inicial, possibilitando um carregamento de outro arquivo.

2. 💻 Tecnologias usadas

Languages, Frameworks & Librarys:
HTML CSS JavaScript React Vite StyledComponents Node Express JSON

Database:
MySQL

IDE:
VSCode

3. 🔌 Para rodar o projeto

O projeto foi construído de forma separada, sendo que o front-end consome uma API. Assim o sistema roda em dois servidores, um para o front e outro para a API.

Front-End

Para rodar o front-end em ambiente de desenvolvimento, se faz necessário ingressar na pasta "front-shopper" pelo terminal e executar os seguintes passos:

  1. Instale as dependências necessárias (relacionadas no package.json):

    npm install
    
  2. Rode a aplicação em ambiente de desenvolvimento:

    npm run dev
    
  3. Utilize a url citada no terminal após o último comando em algum navegador (de preferência Google Chrome).

Back-End

Para rodar a API em ambiente de desenvolvimento, se faz necessário ingressar na pasta "API" pelo terminal e executar os seguintes passos:

  1. Instale as dependências necessárias para rodar a API (relacionadas no package.json):

    npm install
    
  2. A API utiliza o MySQL como banco de dados, então se faz necessário que você tenha-o instalado em sua máquina.

  3. Com ele instalado, crie um database e preencha o arquivo ".env.example" com o host, user_db, password_db e database_name. Em seguida, retire o ".example", deixando apenas ".env" como nome do arquivo.

  4. Rode a aplicação em ambiente de desenvolvimento:

    npm run dev
    
  5. O comando já irá rodar a migration e criar as tabelas e alimentá-las com os dados disponibilizados para o teste.

  6. Você poderá testar a API utilizando o front-end, bastando rodar os dois ao mesmo tempo. Caso queira rodar a API sem a interface, você precisará de uma ferramenta de teste de requisições como o Insomnia, devendo seguir as orientações da documentação.

  7. Caso queira apagar os dados após a utilização e começar de novo, basta apagar as tabelas pelo mysql e rodar a aplicação novamente que a migration vai criar as tabelas e alimentá-las com os dados iniciais do teste.

  8. Utilize localhost:3333 e siga a documentação abaixo para utilizar a API.

4. 📋 Documentação

Endpoints

File
POST /file/ - Salvar o arquivo .csv na pasta do projeto.

Products
GET /products/ Busca de todos produtos
PUT /products/ Atualização de dados de um produto

POST file

Request

Arquivo .csv com dois atributos. Exemplo:

product_code new_price
16 20.15
18 5.29
23 9.57

Response

Sucesso
no body returned for response status: 201

Erro comum

{
    "mensagem": "Falha ao receber o arquivo. Verifique se o arquivo é um .csv",
    "status": 400
}

GET products

Request

Com o arquivo já salvo pela requisição anterior, não é necessário enviar nenhum conteúdo.


Response

Sucesso

{
    "data": {
    	"listProducts": [
	      {
		"code": 16,
		"name": "AZEITE  PORTUGUES  EXTRA VIRGEM GALLO 500ML",
		"currentPrice": "20.49",
		"newPrice": "25.50",
		"validation": "Proibido: valor de reajuste é maior ou menor que 10% do preço atual"
	      },
	      {
		"code": 22,
		"name": "ENERGETICO  RED BULL ENERGY DRINK SEM ACUCAR 250ML",
		"currentPrice": "7.49",
		"newPrice": "6.72",
		"validation": "Proibido: valor é menor que o custo"
	      },
	      {
		"code": 26,
		"name": "ROLO DE PAPEL ALUMUNIO WYDA 30CMX7,5M",
		"currentPrice": "5.79",
		"newPrice": "5.24",
		"validation": "OK!"
	      }
	 ],
	 "valid": false
    },
    "status": 200
}

Erro comum

{
    "mensagem": "Arquivo .csv não possui nenhum registro",
    "status": 400
}

PUT products

Request

Com o arquivo já salvo e todas as validações já realizadas com retorno de "OK!", não é necessário enviar nenhum conteúdo.


Response

Sucesso
no body returned for response status: 200

5. 🎬 Visual

  • Tela inicial
    screen

  • Tela de validação fracassada
    screen

  • Tela de sucesso da validação
    screen

6. 👨‍💻 Autor

Criado por Daniel Justo
linkedin github

Obrigado pela visita!