Projeto C: Sistema de Reserva
Descrição
Desenvolva uma API RESTful para um sistema de reservas (hotéis, restaurantes, salas de conferência ou eventos) permitindo que os usuários pesquisem, reservem e gerenciem suas reservas.
Funcionalidades Requeridas
1. Gestão de Usuários
POST /api/auth/register - Cadastro
POST /api/auth/login - Login (retorna JWT)
GET /api/users/me - Perfil do usuário
PUT /api/users/me - Editar perfil
Entidade User:
- id, email, password, firstName, lastName, phone
- role (CUSTOMER, OWNER, ADMIN)
- createdAt
2. Gestão de Recursos
GET /api/resources - Listar recursos (paginação, filtros)
GET /api/resources/{id} - Detalhe do recurso
GET /api/resources/search - Busca avançada
POST /api/resources - Criar recurso (OWNER/ADMIN)
PUT /api/resources/{id} - Editar recurso
DELETE /api/resources/{id} - Excluir recurso
GET /api/owner/resources - Meus recursos (OWNER)
Entidade Resource:
- id, name, description, type
- location (address, city, country)
- capacity, pricePerHour/pricePerNight
- amenities (List), images
- owner (User), active
- createdAt
3. Disponibilidades
GET /api/resources/{id}/availability - Disponibilidades
POST /api/resources/{id}/availability - Definir disponibilidade (OWNER)
PUT /api/availability/{id} - Editar
DELETE /api/availability/{id} - Excluir
GET /api/resources/{id}/calendar - Calendário do mês
Entidade Availability:
- id, resource, dayOfWeek ou specificDate
- startTime, endTime
- available (boolean)
4. Reservas
POST /api/reservations - Criar reserva
GET /api/reservations - Minhas reservas
GET /api/reservations/{id} - Detalhe da reserva
PUT /api/reservations/{id}/cancel - Cancelar reserva
GET /api/owner/reservations - Reservas dos meus recursos (OWNER)
PUT /api/reservations/{id}/confirm - Confirmar (OWNER)
PUT /api/reservations/{id}/reject - Rejeitar (OWNER)
Entidade Reservation:
- id, resource, user
- startDateTime, endDateTime
- status (PENDING, CONFIRMED, CANCELLED, COMPLETED)
- totalPrice, notes
- createdAt
5. Avaliações e Notas
POST /api/reservations/{id}/review - Deixar uma avaliação
GET /api/resources/{id}/reviews - Avaliações de um recurso
GET /api/reviews/my-reviews - Minhas avaliações
Entidade Review:
- id, reservation, user, resource
- rating (1-5), comment
- createdAt
Esquema do Banco de Dados
users
├── id (PK)
├── email (UNIQUE)
├── password
├── first_name
├── last_name
├── phone
├── role
└── created_at
resources
├── id (PK)
├── name
├── description
├── type
├── address
├── city
├── country
├── capacity
├── price_per_unit
├── price_unit (HOUR, NIGHT, EVENT)
├── owner_id (FK)
├── active
└── created_at
resource_amenities
├── resource_id (FK)
└── amenity (STRING)
resource_images
├── id (PK)
├── resource_id (FK)
└── image_url
availability
├── id (PK)
├── resource_id (FK)
├── day_of_week (0-6)
├── specific_date (nullable)
├── start_time
├── end_time
└── available
reservations
├── id (PK)
├── resource_id (FK)
├── user_id (FK)
├── start_datetime
├── end_datetime
├── status
├── total_price
├── notes
└── created_at
reviews
├── id (PK)
├── reservation_id (FK)
├── user_id (FK)
├── resource_id (FK)
├── rating
├── comment
└── created_at
Regras de Negócio
Disponibilidades
- Verificar as disponibilidades antes da reserva
- Não pode haver sobreposição de reservas confirmadas
- Owner define os horários disponíveis
Reservas
- Cálculo automático do preço total
- E-mail de confirmação (simulação)
- Cancelamento possível até X horas antes
Status da Reserva
PENDING -> CONFIRMED -> COMPLETED
|-> REJECTED
|-> CANCELLED (pelo cliente)
CONFIRMED -> CANCELLED (pelo owner com justificativa)
Avaliações
- Apenas uma avaliação por reserva
- Avaliação possível somente após COMPLETED
- Nota média calculada para cada recurso
Permissões
| Role | Recursos | Reservas | Avaliações |
|---|---|---|---|
| ADMIN | CRUD all | Ver all | Moderar |
| OWNER | CRUD owns | Gerenciar owns | - |
| CUSTOMER | Read all | CRUD owns | Criar |
Endpoints Detalhados
Busca de Recursos
GET /api/resources/search?city=Paris&date=2024-02-15&capacity=4&type=MEETING_ROOM
Authorization: Bearer <token>
Response 200:
{
"content": [
{
"id": 1,
"name": "Sala Eiffel",
"description": "Sala de reunião moderna com vista",
"type": "MEETING_ROOM",
"location": {
"address": "123 Rue de Paris",
"city": "Paris",
"country": "France"
},
"capacity": 10,
"pricePerHour": 50.00,
"amenities": ["WIFI", "PROJECTOR", "WHITEBOARD"],
"averageRating": 4.5,
"reviewCount": 23,
"availableSlots": [
{ "start": "09:00", "end": "12:00" },
{ "start": "14:00", "end": "18:00" }
]
}
],
"page": 0,
"totalElements": 15
}
Criar Reserva
POST /api/reservations
Authorization: Bearer <token>
Content-Type: application/json
{
"resourceId": 1,
"startDateTime": "2024-02-15T09:00:00",
"endDateTime": "2024-02-15T12:00:00",
"notes": "Reunião equipe marketing"
}
Response 201:
{
"id": 1,
"resource": {
"id": 1,
"name": "Sala Eiffel"
},
"user": {
"id": 5,
"firstName": "Marie",
"lastName": "Dupont"
},
"startDateTime": "2024-02-15T09:00:00",
"endDateTime": "2024-02-15T12:00:00",
"status": "PENDING",
"totalPrice": 150.00,
"notes": "Reunião equipe marketing",
"createdAt": "2024-01-20T10:30:00"
}
Calendário
GET /api/resources/1/calendar?month=2024-02
Authorization: Bearer <token>
Response 200:
{
"resource": { "id": 1, "name": "Sala Eiffel" },
"month": "2024-02",
"days": [
{
"date": "2024-02-15",
"slots": [
{ "start": "09:00", "end": "12:00", "status": "BOOKED" },
{ "start": "14:00", "end": "18:00", "status": "AVAILABLE" }
]
},
...
]
}
Deixar uma Avaliação
POST /api/reservations/1/review
Authorization: Bearer <token>
Content-Type: application/json
{
"rating": 5,
"comment": "Excelente sala, muito bem equipada. Recomendo!"
}
Response 201:
{
"id": 1,
"rating": 5,
"comment": "Excelente sala, muito bem equipada. Recomendo!",
"user": { "firstName": "Marie", "lastName": "D." },
"createdAt": "2024-02-16T10:00:00"
}
Testes Requeridos
Testes Unitários
- ResourceService: busca, verificação de disponibilidade
- ReservationService: criar, validar, cancelar
- ReviewService: criar, calcular média
Testes de Integração
- Busca com filtros
- Fluxo de reserva
- Endpoints de gestão do owner
Pontos Bônus
| Funcionalidade | Pontos |
|---|---|
| Notificações por e-mail | +3 |
| Lembretes automáticos (@Scheduled) | +3 |
| Integração com calendário (exportação iCal) | +3 |
| Sistema de pagamento (simulação) | +5 |
| Busca geográfica | +3 |
| Dashboard do proprietário | +5 |
Estimativa de Tempo
| Tarefa | Horas |
|---|---|
| Setup do projeto e DB | 2 |
| Entidades e repositórios | 5 |
| Serviços de negócio | 8 |
| Controllers REST | 5 |
| Segurança e permissões | 5 |
| Testes | 6 |
| Documentação | 2 |
| Bônus | 4-8 |
| Total | 33-41 |