Pular para o conteúdo principal

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​

RoleRecursosReservasAvaliações
ADMINCRUD allVer allModerar
OWNERCRUD ownsGerenciar owns-
CUSTOMERRead allCRUD ownsCriar

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​

FuncionalidadePontos
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​

TarefaHoras
Setup do projeto e DB2
Entidades e repositórios5
Serviços de negócio8
Controllers REST5
Segurança e permissões5
Testes6
Documentação2
Bônus4-8
Total33-41

Voltar ao Projeto Final