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"
}