Skip to content

Felipensct/api-js

Repository files navigation

Sistema de Reserva de Laboratórios

Sistema completo para gerenciamento de reservas de laboratórios em faculdades, desenvolvido em Node.js com Express, MySQL e autenticação JWT.

🚀 Características

  • 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

📊 Estrutura do Banco de Dados

Tabelas Principais

  1. users - Usuários do sistema

    • Estudantes, professores e administradores
    • Autenticação por email e senha
  2. laboratories - Laboratórios disponíveis

    • Informações de capacidade e localização
    • Status (ativo, inativo, manutenção)
  3. equipment - Equipamentos dos laboratórios

    • Associados a laboratórios específicos
    • Controle de disponibilidade
  4. reservations - Reservas dos laboratórios

    • Controle de horários e conflitos
    • Histórico de reservas
  5. reservation_equipment - Equipamentos utilizados nas reservas

    • Relação many-to-many entre reservas e equipamentos

🛠️ Tecnologias Utilizadas

  • 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

📋 Pré-requisitos

  • Node.js (versão 14 ou superior)
  • MySQL (versão 5.7 ou superior)
  • npm ou yarn

🔧 Instalação

  1. Clone o repositório

    git clone <url-do-repositorio>
    cd laboratory-reservation-system
  2. Instale as dependências

    npm install
  3. Configure o banco de dados

    • Crie um banco MySQL
    • Execute o script database/schema.sql
  4. Configure as variáveis de ambiente

    • Copie o arquivo .env e 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

🚀 Execução

Desenvolvimento

npm run dev

Produção

npm start

O servidor estará disponível em http://localhost:3000

📖 Documentação da API

Autenticação

Registro

POST /api/auth/register
Content-Type: application/json

{
  "name": "João Silva",
  "email": "joao@faculdade.edu",
  "password": "123456",
  "role": "student",
  "registration_number": "202401001"
}

Login

POST /api/auth/login
Content-Type: application/json

{
  "email": "joao@faculdade.edu",
  "password": "123456"
}

Laboratórios

Listar laboratórios ativos

GET /api/laboratories/active
Authorization: Bearer seu_token_jwt

Criar laboratório (Admin)

POST /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"
}

Reservas

Criar reserva

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]
}

Minhas reservas

GET /api/reservations/my-reservations
Authorization: Bearer seu_token_jwt

🔒 Segurança

Proteções Implementadas

  1. SQL Injection Prevention

    • Uso de prepared statements em todas as queries
    • Validação de tipos de dados
  2. XSS Protection

    • Sanitização de todas as entradas
    • Headers de segurança com Helmet
  3. Rate Limiting

    • Limite geral: 100 requests por 15 minutos
    • Login: 5 tentativas por 15 minutos
  4. Autenticação JWT

    • Tokens com expiração configurável
    • Verificação em todas as rotas protegidas
  5. Validação de Dados

    • Validação robusta com Joi
    • Verificação de tipos e formatos

Níveis de Permissão

  • Student: Criar e gerenciar próprias reservas
  • Teacher: Mesmas permissões + visualizar mais detalhes
  • Admin: Controle total do sistema

📁 Estrutura do Projeto

├── 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

🧪 Testando a API

Usando curl

  1. 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"}'
  1. Fazer login
curl -X POST http://localhost:3000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"teste@test.com","password":"123456"}'
  1. Listar laboratórios
curl -X GET http://localhost:3000/api/laboratories/active \
  -H "Authorization: Bearer SEU_TOKEN_AQUI"

📝 Dados de Exemplo

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

🤝 Contribuição

  1. Faça um fork do projeto
  2. Crie uma branch para sua feature (git checkout -b feature/AmazingFeature)
  3. Commit suas mudanças (git commit -m 'Add some AmazingFeature')
  4. Push para a branch (git push origin feature/AmazingFeature)
  5. Abra um Pull Request

📄 Licença

Este projeto está sob a licença ISC. Veja o arquivo LICENSE para mais detalhes.

🆘 Suporte

Para dúvidas ou problemas:

  1. Verifique a documentação da API
  2. Consulte os logs do servidor
  3. Abra uma issue no repositório

🔄 Próximas Funcionalidades

  • 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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published