Concetti
Realtime
Aggiornamenti live della board via NATS e pg_notify (OQ-004).
Panoramica
@pzeta/vue-kanban supporta aggiornamenti realtime tramite NATS. Quando abilitato, la board si aggiorna automaticamente quando altri utenti spostano, creano o modificano schede.
Stato attuale: la feature è in sviluppo (OQ-004). Usare enableRealtime: false (default) in produzione.
Architettura
PostgreSQL (pg_notify 'board_events')
→ node-postgrest-sidecar (LISTEN pg_notify)
→ pubblica su NATS subject board.events.{idboard}
→ useBoardEvents (subscribe)
→ callback → reload dati
Abilitazione
<KanbanFasiBoard
board-id="crm"
:current-user-id="userId"
:enable-realtime="true"
/>
Gestione manuale
const events = useBoardEvents(boardId, {
onSchedaSpostata: async () => {
await fasiService.loadSchede()
await fasiMetrics.loadAvanzamento()
},
onSchedaCreata: () => fasiService.loadSchede(),
onSchedaAggiornata: () => fasiService.loadSchede(),
onSchedaEliminata: () => fasiService.loadSchede(),
onAssegnatarioCambiato: () => fasiService.loadSchede(),
})
// Connetti manualmente
events.connect()
// Disconnetti (onUnmounted o cleanup)
events.disconnect()
BoardEventMessage
interface BoardEventMessage {
tipo: BoardEventTipo
idboard: number
payload: {
idscheda: number
idfasecorrente: number
idfaseorigine?: number
idfasedestinazione?: number
idassegnatario?: number | null
datacambio: string
idutente: number
}
}
type BoardEventTipo =
| 'scheda_spostata'
| 'scheda_aggiornata'
| 'scheda_creata'
| 'scheda_eliminata'
| 'assegnatario_cambiato'
Strategia di refresh
Al ricevimento di un evento, la strategia raccomandata è il reload selettivo piuttosto che il full refresh:
onSchedaSpostata: async (payload) => {
// Refresh solo schede e metriche, non tutte le fasi
await Promise.all([
fasiService.loadSchede(),
fasiMetrics.loadAvanzamento(),
fasiMetrics.loadStalli(),
])
},
Trigger PostgreSQL
Lato DB, ogni modifica a fasi.scheda deve chiamare pg_notify:
CREATE OR REPLACE FUNCTION trfn_board_events()
RETURNS trigger AS $$
BEGIN
PERFORM pg_notify('board_events', json_build_object(
'tipo', TG_ARGV[0],
'idboard', NEW.idboard,
'idscheda', NEW.idscheda
)::text);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
La configurazione del trigger è a carico del team di infrastruttura.