Sistema completo para gerenciamento de reservas de laboratórios em faculdades, desenvolvido em Node.js com Express, MySQL e autenticação JWT.
- Autenticação segura com JWT e bcrypt
- Proteção contra SQL Injection usando prepared statements
- Sanitização XSS em todas as entradas
- Rate limiting para prevenir ataques
- Sistema de permissões (estudante, professor, admin)
- 5 tabelas relacionadas para funcionalidade completa
- CRUD completo para todas as entidades
- Validação robusta com Joi
-
users - Usuários do sistema
- Estudantes, professores e administradores
- Autenticação por email e senha
-
laboratories - Laboratórios disponíveis
- Informações de capacidade e localização
- Status (ativo, inativo, manutenção)
-
equipment - Equipamentos dos laboratórios
- Associados a laboratórios específicos
- Controle de disponibilidade
-
reservations - Reservas dos laboratórios
- Controle de horários e conflitos
- Histórico de reservas
-
reservation_equipment - Equipamentos utilizados nas reservas
- Relação many-to-many entre reservas e equipamentos
- Node.js - Runtime JavaScript
- Express.js - Framework web
- MySQL2 - Banco de dados MySQL com prepared statements
- JWT - Autenticação via token
- bcryptjs - Hash de senhas
- Joi - Validação de dados
- Helmet - Segurança HTTP
- CORS - Cross-origin resource sharing
- XSS - Proteção contra Cross-site scripting
- express-rate-limit - Rate limiting
- Node.js (versão 14 ou superior)
- MySQL (versão 5.7 ou superior)
- npm ou yarn
-
Clone o repositório
git clone <url-do-repositorio> cd laboratory-reservation-system
-
Instale as dependências
npm install
-
Configure o banco de dados
- Crie um banco MySQL
- Execute o script
database/schema.sql
-
Configure as variáveis de ambiente
- Copie o arquivo
.enve configure:
DB_HOST=localhost DB_USER=root DB_PASSWORD=sua_senha DB_NAME=laboratory_reservation DB_PORT=3306 JWT_SECRET=seu_jwt_secret_muito_seguro JWT_EXPIRES_IN=24h PORT=3000 NODE_ENV=development
- Copie o arquivo
npm run devnpm startO servidor estará disponível em http://localhost:3000
POST /api/auth/register
Content-Type: application/json
{
"name": "João Silva",
"email": "joao@faculdade.edu",
"password": "123456",
"role": "student",
"registration_number": "202401001"
}POST /api/auth/login
Content-Type: application/json
{
"email": "joao@faculdade.edu",
"password": "123456"
}GET /api/laboratories/active
Authorization: Bearer seu_token_jwtPOST /api/laboratories
Authorization: Bearer token_admin
Content-Type: application/json
{
"name": "Lab de Informática 2",
"description": "Laboratório com 25 computadores",
"capacity": 25,
"location": "Bloco A - Sala 102",
"status": "active"
}POST /api/reservations
Authorization: Bearer seu_token_jwt
Content-Type: application/json
{
"laboratory_id": 1,
"start_time": "2024-03-20T14:00:00",
"end_time": "2024-03-20T16:00:00",
"purpose": "Aula prática de programação",
"equipment_ids": [1, 2, 3]
}GET /api/reservations/my-reservations
Authorization: Bearer seu_token_jwt-
SQL Injection Prevention
- Uso de prepared statements em todas as queries
- Validação de tipos de dados
-
XSS Protection
- Sanitização de todas as entradas
- Headers de segurança com Helmet
-
Rate Limiting
- Limite geral: 100 requests por 15 minutos
- Login: 5 tentativas por 15 minutos
-
Autenticação JWT
- Tokens com expiração configurável
- Verificação em todas as rotas protegidas
-
Validação de Dados
- Validação robusta com Joi
- Verificação de tipos e formatos
- Student: Criar e gerenciar próprias reservas
- Teacher: Mesmas permissões + visualizar mais detalhes
- Admin: Controle total do sistema
├── config/
│ └── database.js # Configuração do banco de dados
├── controllers/
│ ├── AuthController.js # Controlador de autenticação
│ ├── UserController.js # Controlador de usuários
│ ├── LaboratoryController.js
│ ├── EquipmentController.js
│ └── ReservationController.js
├── middleware/
│ ├── auth.js # Middlewares de autenticação
│ └── validation.js # Middlewares de validação
├── models/
│ ├── User.js # Modelo de usuário
│ ├── Laboratory.js # Modelo de laboratório
│ ├── Equipment.js # Modelo de equipamento
│ ├── Reservation.js # Modelo de reserva
│ └── ReservationEquipment.js
├── routes/
│ ├── auth.js # Rotas de autenticação
│ ├── users.js # Rotas de usuários
│ ├── laboratories.js # Rotas de laboratórios
│ ├── equipment.js # Rotas de equipamentos
│ └── reservations.js # Rotas de reservas
├── database/
│ └── schema.sql # Script de criação do banco
├── .env # Variáveis de ambiente
├── server.js # Arquivo principal
└── package.json
- Registrar usuário
curl -X POST http://localhost:3000/api/auth/register \
-H "Content-Type: application/json" \
-d '{"name":"Teste","email":"teste@test.com","password":"123456","role":"student","registration_number":"TEST001"}'- Fazer login
curl -X POST http://localhost:3000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"teste@test.com","password":"123456"}'- Listar laboratórios
curl -X GET http://localhost:3000/api/laboratories/active \
-H "Authorization: Bearer SEU_TOKEN_AQUI"O sistema vem com dados iniciais:
- Admin padrão: admin@faculdade.edu / password
- 5 laboratórios pré-configurados
- 12 equipamentos distribuídos pelos laboratórios
- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Este projeto está sob a licença ISC. Veja o arquivo LICENSE para mais detalhes.
Para dúvidas ou problemas:
- Verifique a documentação da API
- Consulte os logs do servidor
- Abra uma issue no repositório
- Interface web (frontend)
- Notificações por email
- Relatórios de uso
- API de calendário
- Sistema de aprovação de reservas
- Integração com sistemas acadêmicos