Uma API simples e educacional para aprender NestJS construindo uma API inspirada no Mercado Livre.
- Node.js v18+
- npm ou yarn
# 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# GET http://localhost:3000
curl http://localhost:3000Resposta:
{
"message": "API E-commerce rodando! π"
}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)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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! π" } β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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 raizapp.listen(port)β Abre um servidor HTTP na porta especificada- Γ o primeiro arquivo a executar quando vocΓͺ roda
npm run start:dev
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Γ³dulocontrollersβ Lista os Controllers (rotas HTTP)providersβ Lista os Services (lΓ³gica de negΓ³cio)importsβ Para adicionar outros mΓ³dulos (Auth, Produtos, etc)
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
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
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
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 todosGET /products/:id- Buscar umPOST /products- Criar novoPUT /products/:id- AtualizarDELETE /products/:id- Deletar
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- RegistrarPOST /auth/login- LoginPOST /auth/logout- Logout
Novo conceito: Apenas rotas autenticadas funcionam
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)
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)
- Filters (tratamento de erros)
- Interceptors (logs, transformaΓ§Γ΅es)
- Middleware (CORS, logging global)
| 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 |
- Leia a documentaΓ§Γ£o do NestJS junto com o cΓ³digo
- Execute cada exemplo e teste no navegador/Postman
- Modifique o cΓ³digo e veja o que quebra
- Refatore para solidificar o aprendizado
MIT