Proyecto C: Sistema de Reservas
Descripción
Desarrollar una API RESTful para un sistema de reservas (hoteles, restaurantes, salas de conferencias o eventos) que permita a los usuarios buscar, reservar y gestionar sus reservas.
Funcionalidades Requeridas
1. Gestión de Usuarios
POST /api/auth/register - Registro
POST /api/auth/login - Inicio de sesión (devuelve JWT)
GET /api/users/me - Perfil de usuario
PUT /api/users/me - Modificar perfil
Entidad User:
- id, email, password, firstName, lastName, phone
- role (CUSTOMER, OWNER, ADMIN)
- createdAt
2. Gestión de Recursos
GET /api/resources - Lista de recursos (paginación, filtros)
GET /api/resources/{id} - Detalle de recurso
GET /api/resources/search - Búsqueda avanzada
POST /api/resources - Crear recurso (OWNER/ADMIN)
PUT /api/resources/{id} - Modificar recurso
DELETE /api/resources/{id} - Eliminar recurso
GET /api/owner/resources - Mis recursos (OWNER)
Entidad Resource:
- id, name, description, type
- location (address, city, country)
- capacity, pricePerHour/pricePerNight
- amenities (Lista), images
- owner (User), active
- createdAt
3. Disponibilidades
GET /api/resources/{id}/availability - Disponibilidades
POST /api/resources/{id}/availability - Definir disponibilidad (OWNER)
PUT /api/availability/{id} - Modificar
DELETE /api/availability/{id} - Eliminar
GET /api/resources/{id}/calendar - Calendario del mes
Entidad Availability:
- id, resource, dayOfWeek o specificDate
- startTime, endTime
- available (boolean)
4. Reservas
POST /api/reservations - Crear reserva
GET /api/reservations - Mis reservas
GET /api/reservations/{id} - Detalle de reserva
PUT /api/reservations/{id}/cancel - Cancelar reserva
GET /api/owner/reservations - Reservas de mis recursos (OWNER)
PUT /api/reservations/{id}/confirm - Confirmar (OWNER)
PUT /api/reservations/{id}/reject - Rechazar (OWNER)
Entidad Reservation:
- id, resource, user
- startDateTime, endDateTime
- status (PENDING, CONFIRMED, CANCELLED, COMPLETED)
- totalPrice, notes
- createdAt
5. Opiniones y Calificaciones
POST /api/reservations/{id}/review - Dejar una opinión
GET /api/resources/{id}/reviews - Opiniones de un recurso
GET /api/reviews/my-reviews - Mis opiniones
Entidad Review:
- id, reservation, user, resource
- rating (1-5), comment
- createdAt
Esquema de Base de Datos
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
Reglas de Negocio
Disponibilidades
- Verificar las disponibilidades antes de reservar
- No se permiten reservas confirmadas superpuestas
- El Owner define los intervalos disponibles
Reservas
- Cálculo automático del precio total
- Correo de confirmación (simulación)
- Cancelación posible hasta X horas antes
Estados de Reserva
PENDING -> CONFIRMED -> COMPLETED
|-> REJECTED
|-> CANCELLED (por cliente)
CONFIRMED -> CANCELLED (por owner con justificación)
Opiniones
- Solo una opinión por reserva
- Opinión posible únicamente después de COMPLETED
- Calificación promedio calculada para cada recurso
Permisos
| Rol | Recursos | Reservas | Opiniones |
|---|---|---|---|
| ADMIN | CRUD all | Ver all | Modera |
| OWNER | CRUD owns | Gestiona owns | - |
| CUSTOMER | Read all | CRUD owns | Crear |
Endpoints Detallados
Búsqueda 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": "Salle Eiffel",
"description": "Sala de reuniones moderna con 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
}
Crear 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ón equipo de marketing"
}
Response 201:
{
"id": 1,
"resource": {
"id": 1,
"name": "Salle 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ón equipo de marketing",
"createdAt": "2024-01-20T10:30:00"
}
Calendario
GET /api/resources/1/calendar?month=2024-02
Authorization: Bearer <token>
Response 200:
{
"resource": { "id": 1, "name": "Salle 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" }
]
},
...
]
}
Dejar una Opinión
POST /api/reservations/1/review
Authorization: Bearer <token>
Content-Type: application/json
{
"rating": 5,
"comment": "Excelente sala, muy bien equipada. ¡La recomiendo!"
}
Response 201:
{
"id": 1,
"rating": 5,
"comment": "Excelente sala, muy bien equipada. ¡La recomiendo!",
"user": { "firstName": "Marie", "lastName": "D." },
"createdAt": "2024-02-16T10:00:00"
}
Pruebas Requeridas
Pruebas Unitarias
- ResourceService: búsqueda, verificación de disponibilidad
- ReservationService: crear, validar, cancelar
- ReviewService: crear, calcular promedio
Pruebas de Integración
- Búsqueda con filtros
- Flujo de reservas
- Endpoints de gestión de owner
Puntos Extra
| Funcionalidad | Puntos |
|---|---|
| Notificaciones por email | +3 |
| Recordatorios automáticos (@Scheduled) | +3 |
| Integración de calendario (exportación iCal) | +3 |
| Sistema de pagos (simulación) | +5 |
| Búsqueda geográfica | +3 |
| Dashboard de propietario | +5 |
Estimación de Tiempo
| Tarea | Horas |
|---|---|
| Configuración del proyecto y DB | 2 |
| Entidades y repositorios | 5 |
| Servicios de negocio | 8 |
| Controladores REST | 5 |
| Seguridad y permisos | 5 |
| Pruebas | 6 |
| Documentación | 2 |
| Bonus | 4-8 |
| Total | 33-41 |