API REST em Node.js (Express) + TypeScript, com persistência em memória, para gerenciar:
- Automóveis
- Motoristas
- Utilizações (alocação de automóvel por motorista)
Inclui regras de negócio e testes automatizados.
- Node.js + Express
- TypeScript
- Validação: Zod
- Testes: Jest + Supertest
- Persistência: em memória (sem banco)
- Node.js (LTS recomendado)
- npm
Instalar dependências:
npm installRodar em desenvolvimento:
npm run devA API sobe em:
http://localhost:3000
Healthcheck:
GET /health
npm run dev– sobe a API em modo desenvolvimentonpm test– executa os testesnpm run build– gera build emdist/npm start– executa a API a partir dodist/
Nota: em ambientes com Node mais recente (ex.: Node 25+), o script de testes pode incluir
node --no-experimental-webstorageapenas para evitar warnings no console.
Rodar testes:
npm testCriar automóvel:
POST /cars
{ "placa": "ABC-1234", "cor": "preto", "marca": "Fiat" }Listar automóveis (com filtros opcionais):
GET /cars?cor=preto&marca=Fiat
Buscar por id:
GET /cars/:id
Atualizar:
PUT /cars/:id
{ "cor": "branco" }Excluir:
DELETE /cars/:id
Criar motorista:
POST /drivers
{ "nome": "João" }Listar motoristas (com filtro opcional):
GET /drivers?nome=jo
Buscar por id:
GET /drivers/:id
Atualizar:
PUT /drivers/:id
{ "nome": "João da Silva" }Excluir:
DELETE /drivers/:id
Criar utilização (iniciar uso):
POST /usages
{
"dataInicio": "2025-12-18T12:00:00.000Z",
"motivo": "Viagem",
"motoristaId": "UUID",
"automovelId": "UUID"
}Finalizar utilização:
PATCH /usages/:id/finish
{ "dataTermino": "2025-12-18T13:00:00.000Z" }Listar utilizações (retorna com motorista e automóvel):
GET /usages
- Um automóvel não pode estar em uso por mais de um motorista ao mesmo tempo.
- Um motorista não pode usar dois automóveis ao mesmo tempo.
- A persistência é feita em memória (sem banco), conforme permitido no enunciado.
- Ao reiniciar a aplicação, os dados em memória são reinicializados.
$base = "http://localhost:3000"
$car = Invoke-RestMethod -Method Post -Uri "$base/cars" -ContentType "application/json" -Body (@{
placa = "ABC-1234"; cor = "preto"; marca = "Fiat"
} | ConvertTo-Json)
$driver = Invoke-RestMethod -Method Post -Uri "$base/drivers" -ContentType "application/json" -Body (@{
nome = "João"
} | ConvertTo-Json)
$usage = Invoke-RestMethod -Method Post -Uri "$base/usages" -ContentType "application/json" -Body (@{
automovelId = $car.id
motoristaId = $driver.id
dataInicio = (Get-Date).ToString("o")
motivo = "Viagem"
} | ConvertTo-Json)
Invoke-RestMethod -Method Get -Uri "$base/usages"
Invoke-RestMethod -Method Patch -Uri "$base/usages/$($usage.id)/finish" -ContentType "application/json" -Body (@{
dataTermino = (Get-Date).AddMinutes(1).ToString("o")
} | ConvertTo-Json)