API REST desenvolvida em Node.js com Express para gerenciamento de voos, aeronaves, passageiros e cartões de embarque, incluindo sistema completo de autenticação JWT e CRUD de usuários.
- ✅ API RESTful completa com Express.js
- ✅ Banco de dados PostgreSQL
- ✅ Autenticação JWT (JSON Web Token)
- ✅ CRUD completo de usuários com controle de permissões
- ✅ Rotas públicas para consultas
- ✅ Rotas privadas protegidas por autenticação
- ✅ Hash de senhas com bcrypt
- ✅ Validação de dados
- ✅ Tratamento de erros
- ✅ Variáveis de ambiente com dotenv
- ✅ CORS habilitado
- ✅ Paginação em consultas grandes
O banco demo_flight contém:
- sys_user: 4 usuários (2 admin, 2 regular)
- aircraft: 50 aeronaves
- passenger: 10.000 passageiros
- flight: 500 voos
- boarding_pass: 10.000 cartões de embarque
yarn install
# ou
npm installScript SQL para criar o banco:
psql -U postgres -f postgresql_demo_flight_db.sqlCopie o arquivo .env.example para .env:
cp .env.example .envEdite o arquivo .env com suas configurações:
PORT=3000
NODE_ENV=development
DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=sua_senha_aqui
DB_NAME=demo_flight
JWT_SECRET=seu_secret_jwt_super_seguro_aqui
JWT_EXPIRES_IN=24hExecute o script para fazer hash das senhas no banco:
node src/scripts/hashPasswords.jsModo Desenvolvimento (com auto-reload):
yarn dev
# ou
npm run devModo Produção:
yarn start
# ou
npm startA API estará disponível em http://localhost:3000
POST /api/auth/login
Content-Type: application/json
{
"login_email": "[email protected]",
"password": "12345"
}Resposta:
{
"message": "Login realizado com sucesso",
"user": {
"id": 1,
"name": "Alice Johnson",
"email": "[email protected]",
"user_type": "admin"
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}GET /api/auth/verify
Authorization: Bearer {seu_token}GET /api/public/passengers?limit=100&offset=0
GET /api/public/passengers/:idGET /api/public/aircraft
GET /api/public/aircraft/:idGET /api/public/flights?limit=100&offset=0
GET /api/public/flights/:idGET /api/public/boarding-passes?limit=100&offset=0
GET /api/public/boarding-passes/:id
GET /api/public/boarding-passes/full # Consulta JOIN completa (para testes de carga)Todas as requisições devem incluir o header:
Authorization: Bearer {seu_token}
Listar Todos (apenas admin)
GET /api/users
Authorization: Bearer {token_admin}Buscar por ID (admin ou próprio usuário)
GET /api/users/:id
Authorization: Bearer {token}Criar Novo Usuário (apenas admin)
POST /api/users
Authorization: Bearer {token_admin}
Content-Type: application/json
{
"name": "João Silva",
"login_email": "[email protected]",
"password": "senha123",
"user_type": "regular"
}Atualizar Usuário (admin ou próprio usuário)
PUT /api/users/:id
Authorization: Bearer {token}
Content-Type: application/json
{
"name": "João da Silva",
"password": "novasenha123"
}Deletar Usuário (apenas admin)
DELETE /api/users/:id
Authorization: Bearer {token_admin}| Senha | Tipo | |
|---|---|---|
| [email protected] | 12345 | admin |
| [email protected] | 12345 | admin |
| [email protected] | 12345 | regular |
| [email protected] | 12345 | regular |
- Admin: Pode criar, editar e deletar qualquer usuário
- Regular: Pode apenas editar seus próprios dados
- Instale a extensão Thunder Client no VS Code
- Crie uma nova requisição
- Configure o método, URL e corpo conforme a documentação
- Para rotas protegidas, adicione o header
Authorization: Bearer {token}
Login:
curl -X POST http://localhost:3000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"login_email":"[email protected]","password":"12345"}'Consulta Pública:
curl http://localhost:3000/api/public/aircraftConsulta Protegida:
curl http://localhost:3000/api/users \
-H "Authorization: Bearer SEU_TOKEN_AQUI"A rota /api/public/boarding-passes/full retorna a consulta JOIN completa conforme especificado:
SELECT
bp.boarding_pass_id,
bp.seat_number,
bp.issue_time,
p.first_name AS passenger_first_name,
p.last_name AS passenger_last_name,
p.birth_date AS passenger_birth_date,
p.passport_number AS passenger_passport_number,
f.flight_number,
f.departure_airport,
f.arrival_airport,
f.departure_time,
f.arrival_time,
a.model AS aircraft_model,
a.manufacturer AS aircraft_manufacturer,
a.capacity AS aircraft_capacity
FROM boarding_pass bp
JOIN passenger p ON bp.passenger_id = p.passenger_id
JOIN flight f ON bp.flight_id = f.flight_id
JOIN aircraft a ON f.aircraft_id = a.aircraft_id
ORDER BY bp.boarding_pass_id;crud_demo_flight/
├── src/
│ ├── config/
│ │ └── database.js # Configuração do PostgreSQL
│ ├── controllers/
│ │ ├── authController.js # Autenticação e login
│ │ ├── userController.js # CRUD de usuários
│ │ └── publicController.js # Consultas públicas
│ ├── middleware/
│ │ └── auth.js # Middleware JWT
│ ├── routes/
│ │ ├── authRoutes.js # Rotas de autenticação
│ │ ├── userRoutes.js # Rotas de usuários
│ │ └── publicRoutes.js # Rotas públicas
│ └── scripts/
│ └── hashPasswords.js # Script para hash de senhas
├── index.js # Ponto de entrada da aplicação
├── package.json
├── .env.example
├── .gitignore
└── README.md
- Node.js - Runtime JavaScript
- Express.js - Framework web
- PostgreSQL - Banco de dados relacional
- pg - Driver PostgreSQL para Node.js
- JWT (jsonwebtoken) - Autenticação baseada em tokens
- bcryptjs - Hash de senhas
- dotenv - Variáveis de ambiente
- cors - Cross-Origin Resource Sharing
- nodemon - Auto-reload em desenvolvimento
Para testes de carga em ambiente virtualizado:
- Configurar 2 VMs (uma para API, outra para PostgreSQL)
- Configurar rede virtual privada ou modo bridge
- Atualizar as variáveis de ambiente com os IPs corretos
- Utilizar ferramentas de teste de carga (Apache JMeter, k6, Artillery, etc.)
- Monitorar CPU, RAM, Disco e transferência de rede
- Tutorial WebAPI Node.js com PostgreSQL
- Autenticação JWT em Node.js
- Documentação Express.js
- Documentação PostgreSQL
Apache 2.0
Desenvolvido para o projeto de API REST com CRUD em JavaScript