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.