Este projeto é uma aplicação de e-commerce desenvolvida para o teste tecnico. O back-end foi construído utilizando NestJS e inclui funcionalidades de autenticação, gerenciamento de carrinho e integração com APIs de fornecedores para listar produtos.
- Estrutura do Projeto
- Documentação dos Endpoints
- Como Acessar a Documentação Swagger
- Passos para Configuração
Este back-end foi desenvolvido como parte de um desafio técnico para a construção de um sistema de e-commerce. A aplicação lida com funcionalidades cruciais, como a autenticação de usuários, o gerenciamento de carrinho de compras, e a integração com APIs de fornecedores para a listagem de produtos.
-
Escolha do NestJS: O NestJS foi escolhido devido à sua estrutura modular e à facilidade com que permite escalar aplicações Node.js. O uso de TypeScript garantiu tipagem estática, o que melhora a qualidade do código e reduz erros em tempo de execução.
-
Integração com APIs de Fornecedores: A integração com APIs de fornecedores externos foi projetada para ser eficiente e segura. A aplicação consome dados de produtos dessas APIs e os disponibiliza aos usuários finais.
-
Autenticação JWT: Implementou-se a autenticação via JWT (JSON Web Token) para garantir a segurança das sessões dos usuários, mantendo os dados protegidos.
-
Persistência de Dados com Sequelize: Para a camada de persistência, foi utilizado o Sequelize como ORM, o que facilita a interação com o banco de dados e garante a portabilidade do código.
DB_ROOT_USER='root' DB_PASSWORD='your_password' DB_DATABASE='empreendimento' SECRET_KEY='your_env' PROD='false'
-
Inicie o servidor:
npm run start
-
Acesse a documentação da API:
- A documentação do Swagger estará disponível em http://localhost:3000/api-docs
├── src/
│ ├── auth/
│ │ ├── models/
│ │ │ └── token.dto.ts
│ │ ├── services/
│ │ │ ├── abstract-auth.service.ts
│ │ │ └── auth.service.ts
│ │ └── auth.module.ts
│ │
│ ├── config/
│ │ └── databasse.config.ts
│ │
│ ├── guard/
│ │ └── jwt-auth.guard.ts
│ │
│ ├── cart/
│ │ ├── controllers/
│ │ │ └── cart.controller.ts
│ │ ├── models/
│ │ │ └── cart.dto.ts
│ │ ├── repositories/
│ │ │ ├── entity/
│ │ │ │ └── cart.entity.ts
│ │ │ ├── abstract-repository-cart.service.ts
│ │ │ └── repository-cart.service.ts
│ │ ├── services/
│ │ │ ├── cart.service.ts
│ │ │ └── abstract-cart.service.ts
│ │ └── cart.module.ts
│ │
│ ├── products/
│ │ ├── controllers/
│ │ │ └── products.controller.ts
│ │ ├── services/
│ │ │ ├── abstract-products.service.ts
│ │ │ └── products.service.ts
│ │ └── products.module.ts
│ │
│ └── user/
│ ├── controllers/
│ │ └── user.controller.ts
│ ├── models/
│ │ ├── user-models.dto.ts
│ │ └── user.dto.ts
│ ├── repositories/
│ │ ├── entity/
│ │ │ └── user.entity.ts
│ │ ├── abstract-repository-user.service.ts
│ │ └── repository-user.service.ts
│ ├── services/
│ │ ├── user.service.ts
│ │ └── abstract-user.service.ts
│ └── user.module.ts
│
├── app.module.ts
├── main.ts
├── test/
├── docker-compose.yml
├── .env
├── .eslintrc.js
├── .gitignore
├── .prettierrc
└── .swcrc
Autenticação de usuário.
{
"email": "user@example.com",
"password": "password123"
}
-
200 OK: Login bem-sucedido.
{ "token": "jwt_token" }
-
401 Unauthorized: Credenciais inválidas.
Registro de um novo usuário.
{
"name": "John Doe",
"email": "user@example.com",
"password": "password123"
}
-
201 Created: Registro bem-sucedido.
{ "token": "jwt_token" }
Validação da chave de autenticação de usuário.
{
"token": "asdasdasodnoi ...",
}
-
200 OK: Login bem-sucedido.
{ "data": {...} }
-
401 Unauthorized: Credenciais inválidas.
Recupera todos os produtos.
-
200 OK: Lista de todos os produtos.
[ { "id": "1", "name": "Product 1", "description": "This is product 1", "price": 100 }, { "id": "2", "name": "Product 2", "description": "This is product 2", "price": 200 } ]
Recupera um produto pelo ID e o Provide do produto.
id
: ID do produto.provider
: provedor do produto.
-
200 OK: Produto especificado recebido.
{ "id": "1", "name": "Product 1", "provider": "Brazilian", "description": "This is product 1", "price": 100 ... }
-
404 Not Found: Produto não encontrado.
Recupera um produto pelo nome. Utiliza da biblioteca fuzy.js para fazer comparativos e logica fuzy para trazer a melhor correspondencia com base no nome
name
: Nome do produto.
-
200 OK: Produto com o ID especificado.
[ { "id": "1", "name": "Product 1", "provider": "Brazilian", "description": "This is product 1", "price": 100 ... } ]
-
404 Not Found: Produto não encontrado.
Adiciona um item ao carrinho.
{
"productId": "1",
"quantity": 1
}
-
201 Created: Item adicionado ao carrinho com sucesso.
{ "id": "1", "productId": "1", "quantity": 1, "userEmail": "user@example.com" }
-
401 Unauthorized: Campo de e-mail não pode ser nulo.
Recupera todos os itens no carrinho.
-
200 OK: Itens do carrinho recuperados com sucesso.
[ { "id": "1", "productId": "1", "quantity": 1, "userEmail": "user@example.com" }, { "id": "2", "productId": "2", "quantity": 2, "userEmail": "user@example.com" } ]
-
401 Unauthorized: Não autorizado.
Recupera todos os itens no carrinho que ja foram comprados pelo cliente.
-
200 OK: Itens do carrinho recuperados com sucesso.
[ { "id": "1", "productId": "1", "quantity": 1, "userEmail": "user@example.com" }, { "id": "2", "productId": "2", "quantity": 2, "userEmail": "user@example.com" } ]
-
401 Unauthorized: Não autorizado.
Atualiza um item no carrinho.
productId
: ID do produto.
{
"quantity": 2
}
-
200 OK: Item do carrinho atualizado com sucesso.
{ "id": "1", "productId": "1", "quantity": 2, "userEmail": "user@example.com" }
-
401 Unauthorized: Campo de e-mail não pode ser nulo.
Remove um item do carrinho.
productId
: ID do produto.
- 204 No Content: Item do carrinho removido com sucesso.
- 401 Unauthorized: Não autorizado.
Limpa todos os itens do carrinho.
- 204 No Content: Carrinho limpo com sucesso.
- 401 Unauthorized: Não autorizado.
Finaliza a compra.
- 200 OK: Compra finalizada com sucesso.
- 401 Unauthorized: Não autorizado.
Para acessar a documentação interativa da API, você pode utilizar o Swagger. A documentação estará disponível em:
http://localhost:3000/api-docs
A partir dessa URL, você poderá explorar e testar os endpoints da API de maneira intuitiva.