DéveloppeursVersion tablette · pilote
Lire la salle et envoyer une action
Instantanés, versions et commandes idempotentes du parcours tablette.
Lire l’instantané
GET /api/room renvoie serverNow, plan, service, tables et groups. plan et service peuvent être null. Les tables du plan portent leur géométrie et leur libellé ; les tables du service portent leur état, version, chrono, niveau, actions disponibles et possibilité d’annulation.
Le client actuel relit l’instantané chaque seconde. Aucun WebSocket ni flux SSE public n’est encore fourni. Les dates sont en UTC ; l’interface les affiche en Europe/Paris.
const response = await fetch("/api/room", {
credentials: "same-origin",
cache: "no-store",
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const room = await response.json();Exemple sans plan préparé
{
"serverNow": "2026-10-21T18:30:00.000Z",
"plan": null,
"service": null,
"tables": [],
"groups": []
}Écrire une commande
POST /api/room/services ouvre un service avec { id }. Ici id est l’UUID du nouveau service. Les autres commandes utilisent un UUID id propre à l’action. Une mutation de table exige également expectedVersion, issu du dernier instantané.
Les actions sont seat, greet, order, serve, request_bill, deliver_bill, pay, depart, clear et undo. Utilisez les actions proposées par l’instantané : toutes les transitions ne sont pas permises.
Dans l’exemple, service et table proviennent du dernier instantané et la table est libre et non réunie. Le navigateur ajoute Origin automatiquement.
const command = {
id: crypto.randomUUID(),
type: "seat",
expectedVersion: table.version,
};
const response = await fetch(
`/api/room/services/${service.id}/tables/${table.tableId}/commands`,
{
method: "POST",
credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(command),
},
);
// Keep the same command object when retrying an uncertain response.Reprise et concurrence
Après une réponse réseau incertaine, rejouez exactement le même identifiant et le même contenu. Une réponse duplicate: true confirme qu’une commande identique est déjà enregistrée. Elle ne remplace pas une nouvelle lecture de la salle.
Un conflit de version impose de relire l’instantané et de vérifier l’intention de l’opérateur. Ne modifiez pas automatiquement expectedVersion pour forcer une action périmée.
Pour une table réunie, ajoutez groupId et members: [{ tableId, version }]. Les opérations de groupe exigent id, type, groupId, expectedVersion, primaryTableId et members. type vaut join, split, undo_join ou undo_split ; expectedVersion est la version du groupe, ou zéro pour sa première réunion.
{ "duplicate": false }
// A successful retry of the same command:
{ "duplicate": true }Besoin d’un coup de main ?
Indiquez l’étape qui bloque et le message affiché. Gardez vos mots de passe et codes de connexion privés.
Contacter l’équipe Kelna