API REST para gerenciamento de salas de reunião da empresa Time B
Sistema interno para agendamento e gerenciamento de salas de reunião, desenvolvido para resolver conflitos de uso e otimizar a utilização dos espaços da empresa Time B.
- Autenticação Segura: Acesso restrito apenas a funcionários com email @timeb.com
- Gestão de Salas: Listagem e consulta de disponibilidade de salas
- Agendamento Inteligente: Sistema de reservas com validação de conflitos
- Check-in/Check-out: Controle de presença nas reuniões
- No-Show Automático: Cancelamento automático após 10 minutos de tolerância
- API RESTful: Endpoints bem estruturados seguindo padrões REST
- Node.js (versão 16 ou superior)
- npm ou yarn
-
Clone o repositório
git clone <url-do-repositorio> cd SprintAgilTimeb
-
Instale as dependências
npm install
-
Execute o projeto
# Desenvolvimento (com nodemon) npm run dev # Produção npm start
-
Acesse a aplicação
- API: http://localhost:3000
- Documentação: http://localhost:3000/api-docs
- Health Check: http://localhost:3000/health
O projeto segue o padrão MVC (Model-View-Controller):
src/
├── controllers/ # Lógica de negócio
├── models/ # Modelos de dados
├── routes/ # Definição das rotas
├── middleware/ # Middlewares (auth, errors)
└── utils/ # Utilitários (JWT, validações, scheduler)
POST /api/v1/auth/login
{
"email": "joao.silva@timeb.com",
"password": "senha123"
}Resposta:
{
"success": true,
"message": "Login realizado com sucesso",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "João Silva",
"email": "joao.silva@timeb.com"
},
"expiresIn": "8h"
}
}Inclua o token em todas as requisições:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/v1/rooms |
Listar salas (com filtros) |
| GET | /api/v1/rooms/{id} |
Detalhes de uma sala |
| GET | /api/v1/rooms/{id}/availability |
Verificar disponibilidade |
Exemplo - Listar salas:
GET /api/v1/rooms?minCapacity=15&maxCapacity=25Exemplo - Verificar disponibilidade:
GET /api/v1/rooms/{roomId}/availability?start=2024-01-15T09:00:00.000Z&end=2024-01-15T11:00:00.000Z| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/v1/bookings |
Criar reserva |
| GET | /api/v1/bookings |
Listar reservas (com filtros) |
| GET | /api/v1/bookings/{id} |
Detalhes de uma reserva |
| DELETE | /api/v1/bookings/{id} |
Cancelar reserva |
Exemplo - Criar reserva:
POST /api/v1/bookings
{
"roomId": "123e4567-e89b-12d3-a456-426614174000",
"start": "2024-01-15T09:00:00.000Z",
"end": "2024-01-15T11:00:00.000Z",
"title": "Reunião de Planejamento",
"attendees": ["maria.santos@timeb.com", "pedro.oliveira@timeb.com"]
}| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/v1/bookings/{id}/checkin |
Fazer check-in |
| POST | /api/v1/bookings/{id}/checkout |
Fazer check-out |
Exemplo - Check-in:
POST /api/v1/bookings/{bookingId}/checkin
{
"token": "check-in-token-fornecido-na-criacao"
}- ✅ Acesso apenas para emails @timeb.com
- ✅ Todos os funcionários têm as mesmas permissões
- ✅ Apenas o organizador pode gerenciar sua reserva
- ✅ Capacidade entre 10 e 30 pessoas
- ✅ Total de salas entre 3 e 19
- ✅ Apenas salas ativas são listadas
- ✅ Duração máxima de 2 horas
- ✅ Verificação de conflitos (sala e organizador)
- ✅ Apenas datas futuras
- ✅ Check-in durante o horário da reunião
- ✅ Tolerância de 10 minutos (no-show automático)
- ✅ Check-out antecipado libera a sala
| Código | Descrição |
|---|---|
| 200 | Sucesso em listagens e ações |
| 201 | Reserva criada |
| 204 | Cancelamento concluído |
| 400 | Dados inválidos |
| 401 | Não autenticado |
| 403 | Acesso negado (domínio) |
| 404 | Recurso não encontrado |
| 409 | Conflito de horário |
| 422 | Capacidade fora do intervalo |
| 500 | Erro interno |
O sistema vem com 5 usuários pré-cadastrados:
| Nome | Senha | |
|---|---|---|
| João Silva | joao.silva@timeb.com | senha123 |
| Maria Santos | maria.santos@timeb.com | senha123 |
| Pedro Oliveira | pedro.oliveira@timeb.com | senha123 |
| Ana Costa | ana.costa@timeb.com | senha123 |
| Carlos Ferreira | carlos.ferreira@timeb.com | senha123 |
- Sala Alpha - 15 pessoas (1º Andar - Ala Norte)
- Sala Beta - 20 pessoas (1º Andar - Ala Sul)
- Sala Gamma - 12 pessoas (2º Andar - Ala Norte)
- Sala Delta - 25 pessoas (2º Andar - Ala Sul)
- Sala Epsilon - 10 pessoas (3º Andar - Centro)
- Sala Zeta - 30 pessoas (3º Andar - Ala Norte)
- Sala Eta - 18 pessoas (1º Andar - Centro)
- Sala Theta - 14 pessoas (2º Andar - Centro)
Acesse a documentação completa da API em: http://localhost:3000/api-docs
A documentação Swagger inclui:
- Todos os endpoints disponíveis
- Exemplos de requisições e respostas
- Teste interativo dos endpoints
- Schemas dos modelos de dados
curl -X POST http://localhost:3000/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"joao.silva@timeb.com","password":"senha123"}'curl -X GET http://localhost:3000/api/v1/rooms \
-H "Authorization: Bearer SEU_TOKEN_AQUI"curl -X POST http://localhost:3000/api/v1/bookings \
-H "Authorization: Bearer SEU_TOKEN_AQUI" \
-H "Content-Type: application/json" \
-d '{
"roomId": "ID_DA_SALA",
"start": "2024-12-20T09:00:00.000Z",
"end": "2024-12-20T11:00:00.000Z",
"title": "Reunião de Teste",
"attendees": ["maria.santos@timeb.com"]
}'- Sistema verifica reservas a cada minuto
- Cancela automaticamente após 10 minutos de tolerância
- Libera a sala para novos agendamentos
- Remove reservas antigas (30+ dias) automaticamente
- Mantém performance da aplicação
- Logs detalhados de ações importantes
- Estatísticas do sistema a cada 30 minutos
- Health check endpoint para monitoramento
# Desenvolvimento com hot-reload
npm run dev
# Produção
npm start
# Reinicializar dados
npm run seedOs dados são armazenados em memória usando variáveis globais:
global.users- Usuários do sistemaglobal.rooms- Salas disponíveisglobal.bookings- Reservas realizadas
- Node.js - Runtime JavaScript
- Express.js - Framework web
- JWT - Autenticação
- bcryptjs - Criptografia de senhas
- Swagger - Documentação da API
- UUID - Geração de IDs únicos
- Tokens JWT com expiração (8h)
- Rate limiting (100 req/15min por IP)
- Validação rigorosa de domínio de email
- Sanitização de dados de entrada
- Headers de segurança (Helmet.js)
O sistema gera logs para:
- ✅ Inicialização do servidor
- ✅ Processamento de no-shows
- ✅ Estatísticas periódicas
- ✅ Limpeza de dados antigos
-
Erro 403 - Acesso negado
- Verifique se o email termina com @timeb.com
-
Erro 401 - Token inválido
- Token pode ter expirado (8h de validade)
- Faça login novamente
-
Erro 409 - Conflito de horário
- Sala ou organizador já possui reserva no horário
- Verifique disponibilidade antes de agendar
-
Servidor não inicia
- Verifique se a porta 3000 está livre
- Execute
npm installnovamente
Para dúvidas ou problemas:
- Consulte a documentação Swagger
- Verifique os logs do servidor
- Entre em contato com a equipe de desenvolvimento
Desenvolvido para Time B | Versão 1.0.0 | 2024