Full-stack property buy/sell with governed CRUD, validation at the API boundary, and Pusher-driven live UI — operators see listing and transaction state change without polling.
Laravel owns models, validation rules, and admin CRUD. Vue SPA consumes versioned JSON. Domain events (listing published, offer accepted) broadcast on private Pusher channels scoped per operator role.
| Option | Trade-off | Chosen |
|---|---|---|
| Pusher channels | External dependency | Fast operator UX without running our own WS cluster |
| Laravel events | Must stay thin | Emit after DB commit — UI never sees rolled-back state |
| Vue per workflow | More bundles | Buy vs sell vs admin isolated; shared form components |
DB::transaction(function () use ($listing) {
$listing->transitionTo('published');
});
event(new ListingPublished($listing)); // → Pusher private channel
Niaga Prestasi programme. Same client group as TLMS case study.