feat: salva partite su SQLite e aggiunge storico in dev

- Aggiunge src/db.js con better-sqlite3: tabella partite con nomi,
  modalità, set, formazione di partenza per set, punteggi e vincitore
- Salvataggio automatico al termine della partita (websocket-handler.js)
- Aggiunge formInizioSet in gameState per tracciare la formazione
  iniziale di ogni set
- Aggiunge storico.html: pagina vanilla dark-theme con lista partite
  espandibili (set, punteggio, formazioni)
- Aggiunge server storico su porta 3002 in dev (vite-plugin-websocket.js)
- Aggiunge endpoint /api/partite su displayApp (server.js)
- Migliora banner di avvio con URL storico locale e da rete
- Migliora log WebSocket: connessione aperta, ruolo unregistered, client rimanenti
- Aggiorna .gitignore: ignora tutta la cartella data/
This commit is contained in:
2026-02-21 18:36:58 +01:00
parent d9e1ac751f
commit 1df239ed3d
10 changed files with 856 additions and 7 deletions

62
src/db.js Normal file
View File

@@ -0,0 +1,62 @@
import Database from 'better-sqlite3'
import { mkdirSync } from 'fs'
import { join, dirname } from 'path'
import { fileURLToPath } from 'url'
const __dirname = dirname(fileURLToPath(import.meta.url))
const DATA_DIR = join(__dirname, '..', 'data')
const DB_PATH = process.env.DB_PATH || join(DATA_DIR, 'partite.db')
mkdirSync(DATA_DIR, { recursive: true })
const db = new Database(DB_PATH)
db.pragma('journal_mode = WAL')
db.exec(`
CREATE TABLE IF NOT EXISTS partite (
id INTEGER PRIMARY KEY AUTOINCREMENT,
data TEXT NOT NULL,
modalita TEXT NOT NULL,
nome_home TEXT NOT NULL,
nome_guest TEXT NOT NULL,
set_home INTEGER NOT NULL,
set_guest INTEGER NOT NULL,
vincitore TEXT,
json TEXT NOT NULL
)
`)
const stmtInsert = db.prepare(`
INSERT INTO partite (data, modalita, nome_home, nome_guest, set_home, set_guest, vincitore, json)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`)
export function salvaPartita(state) {
const payload = {
data: new Date().toISOString(),
modalita: state.modalitaPartita,
nomi: state.sp.nomi,
set: state.sp.set,
vincitore: state.sp.partitaFinita?.vincitore ?? null,
strisce: state.sp.strisce,
}
const { lastInsertRowid } = stmtInsert.run(
payload.data,
payload.modalita,
payload.nomi.home,
payload.nomi.guest,
payload.set.home,
payload.set.guest,
payload.vincitore,
JSON.stringify(payload)
)
return lastInsertRowid
}
export function getPartite() {
return db.prepare('SELECT * FROM partite ORDER BY id DESC').all()
}
export function getPartita(id) {
return db.prepare('SELECT * FROM partite WHERE id = ?').get(id)
}