Réservations
Les réservations sont liées à une conversation et permettent de formaliser une activité entre deux membres.
Cycle de vie
- Seul le non-créateur de la réservation peut l'accepter ou la refuser
- Les statuts sont terminaux :
acceptedetdeclinedsont irréversibles priceest stocké enDECIMAL— Sequelize peut retourner une string, toujours faireparseFloat()
Message système de réservation
Lorsqu'une réservation est créée, un message système au format JSON est automatiquement posté dans la conversation. Ce message sert de notification temps réel à l'autre participant.
{
"__type": "reservation",
"id": 3,
"title": "Randonnée Fontainebleau",
"price": 45.00,
"date": "2025-04-10T09:00:00.000Z",
"end_date": "2025-04-10T17:00:00.000Z",
"status": "pending",
"creator_id": 42
}
Les messages dont content commence par {"__type":"reservation" sont des messages système et doivent être filtrés de l'affichage textuel. L'affichage de la réservation est géré par un composant dédié (ReservationBubble) qui parse ce JSON.
Événements WebSocket
La création et les mises à jour de statut sont diffusées en temps réel via Socket.IO à tous les participants de la conversation.
| Événement | Déclencheur | Payload |
|---|---|---|
reservation_created | POST /reservations | { reservation } |
reservation_updated | PATCH .../accept ou .../decline | { reservation } |
Voir Événements WebSocket pour le détail des payloads.
POST /reservations
Auth requis
Crée une réservation dans une conversation.
Validations
dateetend_datedoivent être dans le futurend_datedoit être postérieure àdatepricedoit être > 0- L'utilisateur doit être participant de la conversation
Request
POST /reservations
Authorization: Bearer <token>
Content-Type: application/json
{
"title": "Randonnée Fontainebleau",
"conversation_id": 5,
"price": 45.00,
"date": "2025-04-10T09:00:00.000Z",
"end_date": "2025-04-10T17:00:00.000Z"
}
| Champ | Type | Requis | Description |
|---|---|---|---|
title | string | Oui | Titre de l'activité |
conversation_id | number | Oui | ID de la conversation |
price | number | Oui | Tarif (décimal, ex: 45.00) |
date | ISO 8601 | Oui | Date de début |
end_date | ISO 8601 | Oui | Date de fin |
Response
201 Created
{
"id": 3,
"title": "Randonnée Fontainebleau",
"conversation_id": 5,
"creator_id": 42,
"price": "45.00",
"date": "2025-04-10T09:00:00.000Z",
"end_date": "2025-04-10T17:00:00.000Z",
"status": "pending"
}
GET /reservations/me
Auth requis
Retourne toutes les réservations dans les conversations de l'utilisateur.
Request
GET /reservations/me
Authorization: Bearer <token>
Response
200 OK
[
{
"id": 3,
"title": "Randonnée Fontainebleau",
"price": "45.00",
"date": "2025-04-10T09:00:00.000Z",
"end_date": "2025-04-10T17:00:00.000Z",
"status": "accepted",
"creator_id": 42,
"conversation_id": 5
}
]
PATCH /reservations/:id/accept
Auth requis
Accepte une réservation. Seul le destinataire (non-créateur) de la conversation peut accepter.
Request
PATCH /reservations/3/accept
Authorization: Bearer <token>
Response
200 OK
{
"id": 3,
"status": "accepted"
}
403 Forbidden — Tentative d'accepter sa propre réservation
PATCH /reservations/:id/decline
Auth requis
Refuse une réservation.
Request
PATCH /reservations/3/decline
Authorization: Bearer <token>
Response
200 OK
{
"id": 3,
"status": "declined"
}