Projet C: Systeme de Reservation
Description
Developper une API RESTful pour un systeme de reservation (hotels, restaurants, salles de conference, ou evenements) permettant aux utilisateurs de rechercher, reserver et gerer leurs reservations.
Fonctionnalites Requises
1. Gestion des Utilisateurs
POST /api/auth/register - Inscription
POST /api/auth/login - Connexion (retourne JWT)
GET /api/users/me - Profil utilisateur
PUT /api/users/me - Modifier profil
Entite User:
- id, email, password, firstName, lastName, phone
- role (CUSTOMER, OWNER, ADMIN)
- createdAt
2. Gestion des Ressources
GET /api/resources - Liste ressources (pagination, filtres)
GET /api/resources/{id} - Detail ressource
GET /api/resources/search - Recherche avancee
POST /api/resources - Creer ressource (OWNER/ADMIN)
PUT /api/resources/{id} - Modifier ressource
DELETE /api/resources/{id} - Supprimer ressource
GET /api/owner/resources - Mes ressources (OWNER)
Entite Resource:
- id, name, description, type
- location (address, city, country)
- capacity, pricePerHour/pricePerNight
- amenities (List), images
- owner (User), active
- createdAt
3. Disponibilites
GET /api/resources/{id}/availability - Disponibilites
POST /api/resources/{id}/availability - Definir disponibilite (OWNER)
PUT /api/availability/{id} - Modifier
DELETE /api/availability/{id} - Supprimer
GET /api/resources/{id}/calendar - Calendrier du mois
Entite Availability:
- id, resource, dayOfWeek ou specificDate
- startTime, endTime
- available (boolean)
4. Reservations
POST /api/reservations - Creer reservation
GET /api/reservations - Mes reservations
GET /api/reservations/{id} - Detail reservation
PUT /api/reservations/{id}/cancel - Annuler reservation
GET /api/owner/reservations - Reservations de mes ressources (OWNER)
PUT /api/reservations/{id}/confirm - Confirmer (OWNER)
PUT /api/reservations/{id}/reject - Rejeter (OWNER)
Entite Reservation:
- id, resource, user
- startDateTime, endDateTime
- status (PENDING, CONFIRMED, CANCELLED, COMPLETED)
- totalPrice, notes
- createdAt
5. Avis et Notes
POST /api/reservations/{id}/review - Laisser un avis
GET /api/resources/{id}/reviews - Avis d'une ressource
GET /api/reviews/my-reviews - Mes avis
Entite Review:
- id, reservation, user, resource
- rating (1-5), comment
- createdAt
Schema de Base de Donnees
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
Regles Metier
Disponibilites
- Verifier les disponibilites avant reservation
- Pas de chevauchement de reservations confirmees
- Owner definit les creneaux disponibles
Reservations
- Calcul automatique du prix total
- Email de confirmation (simulation)
- Annulation possible jusqu'a X heures avant
Statuts Reservation
PENDING -> CONFIRMED -> COMPLETED
|-> REJECTED
|-> CANCELLED (par client)
CONFIRMED -> CANCELLED (par owner avec justification)
Avis
- Un seul avis par reservation
- Avis possible uniquement apres COMPLETED
- Note moyenne calculee pour chaque ressource
Permissions
| Role | Ressources | Reservations | Avis |
|---|---|---|---|
| ADMIN | CRUD all | Voir all | Moderer |
| OWNER | CRUD owns | Gerer owns | - |
| CUSTOMER | Read all | CRUD owns | Creer |
Endpoints Detailles
Recherche de Ressources
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": "Salle de reunion moderne avec vue",
"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
}
Creer Reservation
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": "Reunion equipe 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": "Reunion equipe marketing",
"createdAt": "2024-01-20T10:30:00"
}
Calendrier
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" }
]
},
...
]
}
Laisser un Avis
POST /api/reservations/1/review
Authorization: Bearer <token>
Content-Type: application/json
{
"rating": 5,
"comment": "Excellente salle, tres bien equipee. Je recommande!"
}
Response 201:
{
"id": 1,
"rating": 5,
"comment": "Excellente salle, tres bien equipee. Je recommande!",
"user": { "firstName": "Marie", "lastName": "D." },
"createdAt": "2024-02-16T10:00:00"
}
Tests Requis
Tests Unitaires
- ResourceService: search, availability check
- ReservationService: create, validate, cancel
- ReviewService: create, calculate average
Tests Integration
- Search with filters
- Reservation workflow
- Owner management endpoints
Bonus Points
| Fonctionnalite | Points |
|---|---|
| Notifications email | +3 |
| Rappels automatiques (@Scheduled) | +3 |
| Integration calendrier (iCal export) | +3 |
| Systeme de paiement (simulation) | +5 |
| Recherche geographique | +3 |
| Dashboard proprietaire | +5 |
Estimation Temps
| Tache | Heures |
|---|---|
| Setup projet et DB | 2 |
| Entites et repositories | 5 |
| Services metier | 8 |
| Controllers REST | 5 |
| Securite et permissions | 5 |
| Tests | 6 |
| Documentation | 2 |
| Bonus | 4-8 |
| Total | 33-41 |