Skip to content

JadsonGitHub/crud_demo_flight

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

API Demo Flight - Sistema de Gestão de Voos

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.

📋 Características

  • ✅ 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

🗄️ Banco de Dados

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

🚀 Instalação e Configuração

1. Instalar Dependências

yarn install
# ou
npm install

2. Configurar Banco de Dados PostgreSQL

Script SQL para criar o banco:

psql -U postgres -f postgresql_demo_flight_db.sql

3. Configurar Variáveis de Ambiente

Copie o arquivo .env.example para .env:

cp .env.example .env

Edite 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=24h

4. Hash das Senhas

Execute o script para fazer hash das senhas no banco:

node src/scripts/hashPasswords.js

5. Iniciar o Servidor

Modo Desenvolvimento (com auto-reload):

yarn dev
# ou
npm run dev

Modo Produção:

yarn start
# ou
npm start

A API estará disponível em http://localhost:3000

📚 Documentação da API

Autenticação

Login

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..."
}

Verificar Token

GET /api/auth/verify
Authorization: Bearer {seu_token}

Rotas Públicas (sem autenticação)

Passageiros

GET /api/public/passengers?limit=100&offset=0
GET /api/public/passengers/:id

Aeronaves

GET /api/public/aircraft
GET /api/public/aircraft/:id

Voos

GET /api/public/flights?limit=100&offset=0
GET /api/public/flights/:id

Cartões de Embarque

GET /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)

Rotas Privadas (requerem autenticação)

Todas as requisições devem incluir o header:

Authorization: Bearer {seu_token}

CRUD de Usuários

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}

👥 Usuários Padrão

Email Senha Tipo
[email protected] 12345 admin
[email protected] 12345 admin
[email protected] 12345 regular
[email protected] 12345 regular

🔐 Controle de Permissões

  • Admin: Pode criar, editar e deletar qualquer usuário
  • Regular: Pode apenas editar seus próprios dados

🧪 Testando a API

Com Thunder Client (VS Code)

  1. Instale a extensão Thunder Client no VS Code
  2. Crie uma nova requisição
  3. Configure o método, URL e corpo conforme a documentação
  4. Para rotas protegidas, adicione o header Authorization: Bearer {token}

Com cURL

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/aircraft

Consulta Protegida:

curl http://localhost:3000/api/users \
  -H "Authorization: Bearer SEU_TOKEN_AQUI"

📊 Consulta para Teste de Carga

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;

🏗️ Estrutura do Projeto

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

🛠️ Tecnologias Utilizadas

  • 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

📝 Próximos Passos

Para testes de carga em ambiente virtualizado:

  1. Configurar 2 VMs (uma para API, outra para PostgreSQL)
  2. Configurar rede virtual privada ou modo bridge
  3. Atualizar as variáveis de ambiente com os IPs corretos
  4. Utilizar ferramentas de teste de carga (Apache JMeter, k6, Artillery, etc.)
  5. Monitorar CPU, RAM, Disco e transferência de rede

🔗 Recursos Auxiliares

📄 Licença

Apache 2.0


Desenvolvido para o projeto de API REST com CRUD em JavaScript

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published