Aller au contenu principal

Réservations

Les réservations sont liées à une conversation et permettent de formaliser une activité entre deux membres.

Cycle de vie​

Règles métier
  • Seul le non-créateur de la réservation peut l'accepter ou la refuser
  • Les statuts sont terminaux : accepted et declined sont irréversibles
  • price est stocké en DECIMAL — Sequelize peut retourner une string, toujours faire parseFloat()

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
}
Filtrage côté client

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énementDéclencheurPayload
reservation_createdPOST /reservations{ reservation }
reservation_updatedPATCH .../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​

  • date et end_date doivent être dans le futur
  • end_date doit être postérieure à date
  • price doit ê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"
}
ChampTypeRequisDescription
titlestringOuiTitre de l'activité
conversation_idnumberOuiID de la conversation
pricenumberOuiTarif (décimal, ex: 45.00)
dateISO 8601OuiDate de début
end_dateISO 8601OuiDate 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"
}