Skip to content

Repository files navigation

πŸ›’ E-Commerce API - Projeto Educacional NestJS

Uma API simples e educacional para aprender NestJS construindo uma API inspirada no Mercado Livre.


πŸš€ Quick Start

Requisitos

  • Node.js v18+
  • npm ou yarn

InstalaΓ§Γ£o e ExecuΓ§Γ£o

# 1. Instalar dependΓͺncias
npm install

# 2. Rodar em modo desenvolvimento
npm run start:dev

# 3. A API estarΓ‘ disponΓ­vel em http://localhost:3000

Testar a API

# GET http://localhost:3000
curl http://localhost:3000

Resposta:

{
  "message": "API E-commerce rodando! πŸš€"
}

πŸ“ Entendendo a Arquitetura MΓ­nima

O que temos agora?

Atualmente, temos a estrutura mΓ­nima de uma API NestJS:

src/
β”œβ”€β”€ main.ts              ← Arquivo de entrada (bootstrap da aplicaΓ§Γ£o)
β”œβ”€β”€ app.module.ts        ← MΓ³dulo raiz (agrupa tudo)
β”œβ”€β”€ app.controller.ts    ← Controlador (recebe requisiΓ§Γ΅es HTTP)
└── app.service.ts       ← ServiΓ§o (contΓ©m a lΓ³gica de negΓ³cio)

Fluxo de uma requisiΓ§Γ£o HTTP

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  REQUISIÇÃO HTTP                        β”‚
β”‚                  GET /                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                       β”‚
                       β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚   main.ts                        β”‚
        β”‚   (Cria a aplicaΓ§Γ£o NestJS)      β”‚
        β”‚   (Listen na porta 3000)         β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
                           β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚   app.module.ts                  β”‚
        β”‚   (Agrupa Controllers e          β”‚
        β”‚    Providers/Services)           β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
                           β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚   app.controller.ts              β”‚
        β”‚   (Recebe: GET /                 β”‚
        β”‚    Injeta: AppService            β”‚
        β”‚    Chama: getHello())            β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
                           β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚   app.service.ts                 β”‚
        β”‚   (Executa a lΓ³gica              β”‚
        β”‚    Retorna: {message: "..."})    β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 RESPOSTA JSON                           β”‚
β”‚           { "message": "API rodando! πŸš€" }             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“š As 4 Classes MΓ­nimas Explicadas

1️⃣ main.ts - O Bootstrap da AplicaΓ§Γ£o

O que faz: Inicializa a aplicaΓ§Γ£o NestJS e abre um servidor HTTP.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const port = process.env.PORT ?? 3000;
  await app.listen(port);
  console.log(`πŸš€ API rodando em http://localhost:${port}`);
}
bootstrap();

ExplicaΓ§Γ£o:

  • NestFactory.create() β†’ Cria a aplicaΓ§Γ£o a partir do mΓ³dulo raiz
  • app.listen(port) β†’ Abre um servidor HTTP na porta especificada
  • Γ‰ o primeiro arquivo a executar quando vocΓͺ roda npm run start:dev

2️⃣ app.module.ts - O MΓ³dulo Raiz

O que faz: Define quais Controllers e Providers fazem parte da aplicaΓ§Γ£o.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],           // MΓ³dulos que este mΓ³dulo depende
  controllers: [AppController],  // Controladores HTTP
  providers: [AppService],       // ServiΓ§os (lΓ³gica de negΓ³cio)
})
export class AppModule {}

ExplicaΓ§Γ£o:

  • @Module() β†’ Decorador que marca a classe como um mΓ³dulo
  • controllers β†’ Lista os Controllers (rotas HTTP)
  • providers β†’ Lista os Services (lΓ³gica de negΓ³cio)
  • imports β†’ Para adicionar outros mΓ³dulos (Auth, Produtos, etc)

3️⃣ app.controller.ts - O Controlador HTTP

O que faz: Define as rotas HTTP e delega para o Service.

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()  // Define a base da rota (vazio = raiz /)
export class AppController {
  constructor(private readonly appService: AppService) {}
  // ↑ Injeta o Service automaticamente (Dependency Injection)

  @Get()  // Define um endpoint GET na rota /
  getHello() {
    return this.appService.getHello();
    // ↑ Chama o mΓ©todo do Service
  }
}

ExplicaΓ§Γ£o:

  • @Controller() β†’ Marca a classe como um controlador
  • @Get() β†’ Define um endpoint GET (existem tambΓ©m @Post, @Put, @Delete)
  • constructor(private readonly appService: AppService) β†’ InjeΓ§Γ£o de dependΓͺncia (NestJS fornece automaticamente)
  • O Controller NΓƒO tem lΓ³gica, apenas recebe requisiΓ§Γ΅es e chama o Service

4️⃣ app.service.ts - O ServiΓ§o (LΓ³gica de NegΓ³cio)

O que faz: ContΓ©m a lΓ³gica de negΓ³cio da aplicaΓ§Γ£o.

import { Injectable } from '@nestjs/common';

@Injectable()  // Marca como um provider que pode ser injetado
export class AppService {
  getHello(): { message: string } {
    return { message: 'API E-commerce rodando! πŸš€' };
  }
}

ExplicaΓ§Γ£o:

  • @Injectable() β†’ Marca a classe como um provider (pode ser injetado em Controllers/Services)
  • O Service contΓ©m TODA a lΓ³gica de negΓ³cio
  • MΓΊltiplos Controllers podem usar o mesmo Service

🎯 O Padrão MVC no NestJS

RequisiΓ§Γ£o HTTP
      ↓
   Controller (recebe e valida)
      ↓
   Service (processa a lΓ³gica)
      ↓
   Banco de dados ou outro recurso
      ↓
   Service retorna resultado
      ↓
   Controller retorna resposta
      ↓
Resposta HTTP

πŸ“ˆ Plano de EvoluΓ§Γ£o da API

Fase 1: Produtos (2-3 aulas)

Aprender os conceitos bΓ‘sicos: Controller, Service, Module, DTO

nova estrutura:
src/
β”œβ”€β”€ main.ts
β”œβ”€β”€ app.module.ts
β”œβ”€β”€ app.controller.ts
β”œβ”€β”€ app.service.ts
└── products/                    ← NOVO MΓ“DULO
    β”œβ”€β”€ products.module.ts
    β”œβ”€β”€ products.controller.ts
    β”œβ”€β”€ products.service.ts
    β”œβ”€β”€ entities/
    β”‚   └── product.entity.ts     ← Modelo de dados
    └── dto/
        └── create-product.dto.ts ← ValidaΓ§Γ£o de entrada

Endpoints:

  • GET /products - Listar todos
  • GET /products/:id - Buscar um
  • POST /products - Criar novo
  • PUT /products/:id - Atualizar
  • DELETE /products/:id - Deletar

Fase 2: AutenticaΓ§Γ£o (2-3 aulas)

Aprender: Guards, JWT, Pipes, Decorators

nova estrutura:
src/
β”œβ”€β”€ ...
β”œβ”€β”€ auth/                        ← NOVO MΓ“DULO
β”‚   β”œβ”€β”€ auth.module.ts
β”‚   β”œβ”€β”€ auth.controller.ts
β”‚   β”œβ”€β”€ auth.service.ts
β”‚   β”œβ”€β”€ entities/
β”‚   β”‚   └── user.entity.ts
β”‚   └── dto/
β”‚       β”œβ”€β”€ register.dto.ts
β”‚       └── login.dto.ts
└── common/                      ← CΓ³digo compartilhado
    β”œβ”€β”€ guards/
    β”‚   └── jwt-auth.guard.ts    ← Protege rotas
    β”œβ”€β”€ decorators/
    β”‚   └── current-user.decorator.ts
    └── pipes/
        └── validation.pipe.ts

Endpoints:

  • POST /auth/register - Registrar
  • POST /auth/login - Login
  • POST /auth/logout - Logout

Novo conceito: Apenas rotas autenticadas funcionam


Fase 3: Carrinho de Compras (2 aulas)

Aprender: InjeΓ§Γ£o de dependΓͺncias entre mΓ³dulos

nova estrutura:
src/
β”œβ”€β”€ ...
β”œβ”€β”€ cart/                        ← NOVO MΓ“DULO
β”‚   β”œβ”€β”€ cart.module.ts
β”‚   β”œβ”€β”€ cart.controller.ts
β”‚   β”œβ”€β”€ cart.service.ts
β”‚   β”œβ”€β”€ entities/
β”‚   β”‚   └── cart-item.entity.ts
β”‚   └── dto/
β”‚       └── add-to-cart.dto.ts
β”œβ”€β”€ products/
β”‚   └── ...
└── auth/
    └── ...

Endpoints:

  • GET /cart - Ver carrinho (autenticado)
  • POST /cart - Adicionar produto (autenticado)
  • DELETE /cart/:id - Remover (autenticado)

Novo conceito: O CartService usa ProductsService (mΓ³dulos falando entre si)


Fase 4: Pedidos (2 aulas)

Aprender: LΓ³gica complexa, transaΓ§Γ΅es

nova estrutura:
src/
β”œβ”€β”€ ...
└── orders/                      ← NOVO MΓ“DULO
    β”œβ”€β”€ orders.module.ts
    β”œβ”€β”€ orders.controller.ts
    β”œβ”€β”€ orders.service.ts
    β”œβ”€β”€ entities/
    β”‚   └── order.entity.ts
    └── dto/
        └── create-order.dto.ts

Endpoints:

  • POST /orders - Criar pedido do carrinho (autenticado)
  • GET /orders - Listar meus pedidos (autenticado)
  • GET /orders/:id - Ver detalhes (autenticado)
  • PUT /orders/:id/cancel - Cancelar (autenticado)

Fase 5: Adicionais (extras)

  • Filters (tratamento de erros)
  • Interceptors (logs, transformaΓ§Γ΅es)
  • Middleware (CORS, logging global)

πŸ’‘ Resumo: Por que essa estrutura?

Conceito Por que?
Module Agrupa funcionalidades (produtos, auth, carrinho)
Controller Define rotas HTTP (GET, POST, PUT, DELETE)
Service ContΓ©m a lΓ³gica (nΓ£o mistura com HTTP)
DTO Valida dados que vΓͺm da requisiΓ§Γ£o
Entity Representa um objeto do banco de dados
Guard Protege rotas (autenticaΓ§Γ£o, autorizaΓ§Γ£o)
Decorator Adiciona metadados (JWT, usuΓ‘rio autenticado)
Pipe Transforma e valida dados antes de chegar ao Controller
Interceptor Processa requisiΓ§Γ΅es/respostas (logs, transformaΓ§Γ΅es)
Filter Trata exceΓ§Γ΅es e erros

πŸŽ“ Como Estudar

  1. Leia a documentaΓ§Γ£o do NestJS junto com o cΓ³digo
  2. Execute cada exemplo e teste no navegador/Postman
  3. Modifique o cΓ³digo e veja o que quebra
  4. Refatore para solidificar o aprendizado

πŸ“– ReferΓͺncias


πŸ“„ License

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages