API RESTful para gerenciamento de produtos e clientes desenvolvida com Node.js, TypeScript, Express e SQLite seguindo arquitetura MVC.
- Criar uma API em Node.js usando Express
- Utilizar SQLite como banco de dados
- Criar duas tabelas no banco:
- produtos → id, nome, preço, estoque, data de criação
- clientes → id, nome, email, data de criação
- Implementar rotas de cadastro:
POST /api/produtos→ cadastrar produtoPOST /api/clientes→ cadastrar cliente
- Implementar rotas de consulta:
GET /api/produtos→ listar produtos (com paginação e busca)GET /api/produtos/:id→ buscar produto por IDGET /api/clientes→ listar clientes (com paginação e busca)GET /api/clientes/:id→ buscar cliente por ID
- Regras de validação:
- Produto deve ter nome e preço obrigatórios
- Cliente deve ter nome e email obrigatórios
- Email de cliente deve ser único
- Entregar junto instruções claras de como rodar a API
- Node.js (versão 16 ou superior)
- npm ou yarn
Para melhor atender as necessidades de teste eu deixarei disponível uma aplicação já feita deploy para quem tiver interesse testar em produção: (https://storeappfortest.netlify.app/produtos)[StoreApp]
# Clone o repositório
git clone <url-do-repositorio>
cd products-backend-api
# Instale as dependências
npm install
# Inicialize o banco de dados
npm run init-db
# Compile o TypeScript
npm run build
# Inicie o servidor
npm start# Modo desenvolvimento com ts-node-dev (recomendado)
npm run dev
# Modo desenvolvimento com nodemon (alternativo)
npm run dev:nodemon
# Executar linting
npm run lint
# Corrigir problemas de linting
npm run lint:fixA API está configurada para deploy automático no Render:
# 1. Faça commit do código
git add .
git commit -m "Deploy para produção"
git push origin main
# 2. No Render Dashboard:
# - Conecte seu repositório
# - O arquivo render.yaml configurará tudo automaticamente📖 Guia completo: docs/DEPLOY.md
# Build da imagem
docker build -t products-backend-api .
# Executar container
docker run -p 3000:3000 products-backend-apisrc/
├── controllers/ # Controladores (lógica de negócio)
│ ├── ClientController.ts
│ └── ProductController.ts
├── database/ # Configuração do banco de dados
│ ├── connection.ts
│ └── init.ts
├── middleware/ # Middlewares da aplicação
│ ├── errorHandler.ts
│ └── validation.ts
├── models/ # Modelos de dados
│ ├── Client.ts
│ └── Product.ts
├── routes/ # Definição das rotas
│ ├── clientRoutes.ts
│ ├── index.ts
│ └── productRoutes.ts
├── types/ # Definições de tipos TypeScript
│ └── index.ts
├── app.ts # Configuração do Express
└── server.ts # Ponto de entrada da aplicação
http://localhost:3000/api
- GET
/health- Verificar status da API
- POST
/produtos- Criar produto - GET
/produtos- Listar produtos - GET
/produtos/:id- Buscar produto por ID - PUT
/produtos/:id- Atualizar produto - DELETE
/produtos/:id- Remover produto
- POST
/clientes- Criar cliente - GET
/clientes- Listar clientes - GET
/clientes/:id- Buscar cliente por ID - PUT
/clientes/:id- Atualizar cliente - DELETE
/clientes/:id- Remover cliente
Para as rotas de listagem (GET /produtos e GET /clientes):
page(opcional): Número da página (padrão: 1)limit(opcional): Itens por página (padrão: 10, máximo: 100)search(opcional): Termo de busca
curl -X POST http://localhost:3000/api/produtos \
-H "Content-Type: application/json" \
-d '{
"nome": "Smartphone",
"preco": 899.99,
"estoque": 50
}'curl -X POST http://localhost:3000/api/clientes \
-H "Content-Type: application/json" \
-d '{
"nome": "João Silva",
"email": "joao@email.com"
}'curl "http://localhost:3000/api/produtos?page=1&limit=5&search=smartphone"Todas as respostas seguem o padrão:
{
"success": boolean,
"data"?: any,
"message"?: string,
"error"?: string
}- Node.js - Runtime JavaScript
- TypeScript - Superset tipado do JavaScript
- Express - Framework web
- SQLite3 - Banco de dados
- Express Validator - Validação de dados
- Helmet - Segurança HTTP
- CORS - Cross-Origin Resource Sharing
CREATE TABLE produtos (
id TEXT PRIMARY KEY, -- UUID v4
nome TEXT NOT NULL,
preco REAL NOT NULL,
estoque INTEGER NOT NULL,
created DATETIME DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE clientes (
id TEXT PRIMARY KEY, -- UUID v4
nome TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
created DATETIME DEFAULT CURRENT_TIMESTAMP
);id: UUID v4 (gerado automaticamente)nome: obrigatório, 1-255 caracterespreco: obrigatório, número positivoestoque: obrigatório, número inteiro não negativo
id: UUID v4 (gerado automaticamente)nome: obrigatório, 1-255 caracteresemail: obrigatório, formato válido, único no sistema
A API implementa tratamento robusto de erros:
- 400 - Dados inválidos
- 404 - Recurso não encontrado
- 409 - Conflito (email duplicado)
- 500 - Erro interno do servidor
npm run build- Compilar TypeScriptnpm start- Iniciar servidor (produção)npm run dev- Iniciar servidor (desenvolvimento)npm run init-db- Inicializar banco de dadosnpm run lint- Executar lintingnpm run lint:fix- Corrigir problemas de lintingnpm run render-build- Build para deploy no Rendernpm run clean- Limpar cache e reinstalar dependênciasnpm run dev:nodemon- Desenvolvimento com nodemon