API

Routes HTTP d'administration et publiques de @lrvo/module-booking, et sous-entrée serveur.

Toutes les routes sont servies sous /lrvo/api/booking/. Le contrôle d'accès est déclaré sur la route, jamais vérifié à la main : le routeur du core applique la session, le rate limit, la vérification d'origine et la permission avant d'atteindre le handler.

Administration

auth: 'admin'. Toute lecture est sous booking.view. L'écriture se partage en deux :

PermissionÉcritures
booking.manageappointments et ses transitions.
booking.optionsservices, staff, hours, exceptions, links, et jobs/:name/run.
CheminMéthodes
/booking/admin/configGET
/booking/admin/agendaGET
/booking/admin/calendarGET
/booking/admin/statsGET
/booking/admin/availabilityGET
/booking/admin/appointmentsGET, POST
/booking/admin/appointments/:idGET, PUT, DELETE
/booking/admin/appointments/:id/confirmPOST
/booking/admin/appointments/:id/cancelPOST
/booking/admin/appointments/:id/reschedulePOST
/booking/admin/appointments/:id/completePOST
/booking/admin/appointments/:id/no-showPOST
/booking/admin/appointments/:id/icsGET
/booking/admin/servicesGET, POST
/booking/admin/services/:idGET, PUT, DELETE
/booking/admin/staffGET, POST
/booking/admin/staff/:idGET, PUT, DELETE
/booking/admin/staff/:id/hoursGET, PUT
/booking/admin/hoursGET, PUT
/booking/admin/exceptionsGET, POST
/booking/admin/exceptions/:idDELETE
/booking/admin/linksGET, POST
/booking/admin/links/:idGET, PUT, DELETE
/booking/admin/jobsGET
/booking/admin/jobs/:name/runPOST

GET /booking/admin/availability prend service, staff, from et to, et renvoie exactement ce qu'un visiteur verrait : l'admin et le public lisent la même fonction, ce qui rend impossible un désaccord entre les deux.

Un horaire s'écrit en entier, jamais ligne par ligne : PUT /booking/admin/hours remplace les plages du niveau visé. Une écriture partielle laisserait une plage orpheline dès que l'interface en perd une.

Public

auth: 'public'. Toutes refusent en bloc quand la prise de rendez-vous en ligne est fermée.

CheminMéthodeRôle
/booking/public/embed.jsGETLe script d'intégration en iframe.
/booking/public/link/:slugGETLa définition de l'assistant.
/booking/public/link/:slug/availabilityGETLes créneaux libres.
/booking/public/link/:slug/bookPOSTCréer le rendez-vous.
/booking/public/appointment/:tokenGETLe rendez-vous du client.
/booking/public/appointment/:token/availabilityGETLes créneaux d'un déplacement.
/booking/public/appointment/:token/cancelPOSTAnnuler.
/booking/public/appointment/:token/reschedulePOSTDéplacer.
/booking/public/appointment/:token/icsGETLe fichier calendrier.

Trois règles tiennent cette surface :

  • Le jeton est vérifié avant la base. Un jeton absent ou malformé n'atteint jamais le SELECT.
  • Rien d'interne ne sort. Chaque réponse passe par une projection explicite : pas d'identifiant numérique de rendez-vous, pas de note interne, pas de courriel d'un autre client, et jamais qui occupe une place.
  • La fenêtre est plafonnée à 62 jours par appel, sinon un seul appel peut demander cinq ans de créneaux.

Les identifiants d'intervenant ne sont pas renvoyés par la disponibilité publique : qui recevra le visiteur se décide au moment de réserver, et publier la correspondance ferait de l'endpoint une copie lisible de l'agenda de chacun.

Ordre de déclaration

matchRoute retient le premier motif qui correspond à profondeur et méthode égales, donc un :param masque un littéral de même profondeur. public/embed.js est déclaré avant public/link/:slug, et c'est le seul endroit où se tromper serait silencieux : le navigateur recevrait du HTML là où il attend un script.

Sous-entrée serveur

@lrvo/module-booking/server expose ce qu'un projet hôte peut lire directement, depuis un composant serveur, sans passer par HTTP :

import { getPublicLink, getPublicAvailability, listUpcoming } from '@lrvo/module-booking/server';

listUpcoming(limite) rend les prochains rendez-vous, les annulés mis à part, du plus proche au plus lointain. Sa fenêtre s'ouvre sur la fin et non sur le début : un rendez-vous commencé y reste jusqu'à son heure de fin, comme dans l'agenda.

Volontairement en lecture seule et volontairement étroite. Réserver est une écriture, et une écriture appartient à l'API publique, où le rate limit, les pièges anti-robots et le verrou sont tous en place.

Sur cette page