AULA 23 MÓDULO 1 atividade prática ⏱ 90 min

Atividade: Seu Primeiro Servidor

Síntese do Módulo 1: construa uma API REST completa com Express. GET, POST, PATCH, DELETE. Validação. Estrutura em camadas desde o início.

ExpressNode.jsCRUDRESTvalidaçãocurl404

O que você vai construir

Chegou a hora de juntar tudo do Módulo 1. Você vai criar do zero uma API REST completa com Express — com todos os métodos HTTP, validação e tratamento de erros.

API: GERENCIADOR DE TAREFAS (TODO API)
PASSO 1
Criar projeto Node: npm init, instalar express
PASSO 2
Implementar GET /tasks — listar tarefas (array em memória)
PASSO 3
Implementar POST /tasks — criar tarefa com validação
PASSO 4
Implementar PATCH /tasks/:id — marcar como concluída
PASSO 5
Implementar DELETE /tasks/:id — remover tarefa
PASSO 6
Testar todos os endpoints com curl ou Postman
PASSO 7
Bônus: adicionar paginação e filtro ?completed=true

Estrutura do projeto

Mesmo sendo simples, organize desde o início em camadas — você já sabe SOLID e arquitetura em camadas.

todo-api/
├── src/
│ ├── controllers/ ← taskController.js
│ ├── services/ ← taskService.js
│ ├── data/ ← taskRepository.js (array)
│ └── routes/ ← taskRoutes.js
├── app.js ← configura Express
├── server.js ← inicia o servidor
└── package.json
🧪
testar com curl
curl -s localhost:3000/tasks | jq # listar | curl -X POST -H 'Content-Type: application/json' -d '{"title":"Estudar Node"}' localhost:3000/tasks
javascript
// app.js — servidor Express completo
const express = require('express')
const app = express()
app.use(express.json())

let tasks = []
let nextId = 1

// GET /tasks — listar
app.get('/tasks', (req, res) => {
  const { completed } = req.query
  let result = tasks
  if (completed !== undefined)
    result = tasks.filter(t => String(t.completed) === completed)
  res.json(result)
})

// POST /tasks — criar
app.post('/tasks', (req, res) => {
  const { title } = req.body
  if (!title?.trim())
    return res.status(400).json({ error: 'title obrigatório' })
  const task = { id: nextId++, title, completed: false }
  tasks.push(task)
  res.status(201).json(task)
})

// PATCH /tasks/:id — atualizar
app.patch('/tasks/:id', (req, res) => {
  const task = tasks.find(t => t.id === Number(req.params.id))
  if (!task) return res.status(404).json({ error: 'Not found' })
  Object.assign(task, req.body)
  res.json(task)
})

// DELETE /tasks/:id
app.delete('/tasks/:id', (req, res) => {
  const idx = tasks.findIndex(t => t.id === Number(req.params.id))
  if (idx === -1) return res.status(404).json({ error: 'Not found' })
  tasks.splice(idx, 1)
  res.status(204).send()
})

app.listen(3000, () => console.log('API em :3000'))
quiz · aula 23
Teste seus conhecimentos
0/3 respondidas
QUESTÃO 01
Por que separar routes, controllers e services desde o início?
QUESTÃO 02
Para que serve o middleware express.json()?
QUESTÃO 03
O que diferencia 201 de 200 como resposta de POST?
0/3