My App
RoomKitBackend

BookingStateMachine

Validate and query booking state transitions

Overview

BookingStateMachine is an injectable service that enforces the booking lifecycle. It validates state transitions, reports allowed targets for a given state, and identifies terminal states.

import { BookingStateMachine } from '@roomkit/nestjs';

State Diagram

requested ──→ confirmed ──→ in_progress ──→ completed
    │              │              │
    └──────────────┴──────────────┴──→ cancelled

Transition Table

FromAllowed Targets
requestedconfirmed, cancelled
confirmedin_progress, cancelled
in_progresscompleted, cancelled
completed(terminal)
cancelled(terminal)

Methods

canTransition

Check whether a transition from one status to another is allowed.

canTransition(from: BookingStatus, to: BookingStatus): boolean
ParameterTypeDescription
fromBookingStatusThe current booking status
toBookingStatusThe target booking status
const allowed = stateMachine.canTransition('requested', 'confirmed');
// true

const blocked = stateMachine.canTransition('completed', 'in_progress');
// false

validateTransition

Validate a transition and throw if it is not allowed. Use this when you need to enforce transitions strictly.

validateTransition(from: BookingStatus, to: BookingStatus): void
ParameterTypeDescription
fromBookingStatusThe current booking status
toBookingStatusThe target booking status
stateMachine.validateTransition('requested', 'confirmed');
// No error thrown

stateMachine.validateTransition('completed', 'requested');
// Throws InvalidStateTransitionError

Throws InvalidStateTransitionError with context { currentStatus, attemptedStatus, allowedTransitions }.

getAllowedTransitions

Get all valid target states for a given status.

getAllowedTransitions(from: BookingStatus): BookingStatus[]
ParameterTypeDescription
fromBookingStatusThe current booking status
const targets = stateMachine.getAllowedTransitions('confirmed');
// ['in_progress', 'cancelled']

const noTargets = stateMachine.getAllowedTransitions('completed');
// []

isTerminal

Check whether a status is terminal (no further transitions allowed). Returns true for completed and cancelled.

isTerminal(status: BookingStatus): boolean
ParameterTypeDescription
statusBookingStatusThe booking status to check
stateMachine.isTerminal('completed'); // true
stateMachine.isTerminal('cancelled'); // true
stateMachine.isTerminal('confirmed'); // false

On this page