secutorpro commited on
Commit
24c4890
·
verified ·
1 Parent(s): b5200e2

sqlite schema + seed

Browse files
Files changed (1) hide show
  1. server/src/db.js +36 -39
server/src/db.js CHANGED
@@ -8,71 +8,68 @@ fs.mkdirSync(DATA_DIR, { recursive: true });
8
 
9
  const db = new Database(path.join(DATA_DIR, 'dispatch.db'));
10
  db.pragma('journal_mode = WAL');
11
- db.pragma('foreign_keys = ON');
12
 
13
  db.exec(`
14
  CREATE TABLE IF NOT EXISTS users (
15
- id INTEGER PRIMARY KEY AUTOINCREMENT,
16
- username TEXT UNIQUE NOT NULL,
17
  password_hash TEXT NOT NULL,
18
- role TEXT NOT NULL DEFAULT 'dispatcher',
19
- created_at INTEGER NOT NULL
20
  );
21
  CREATE TABLE IF NOT EXISTS talkgroups (
22
- id INTEGER PRIMARY KEY AUTOINCREMENT,
23
- name TEXT UNIQUE NOT NULL,
24
  color TEXT NOT NULL DEFAULT '#3b82f6'
25
  );
26
  CREATE TABLE IF NOT EXISTS members (
27
- id INTEGER PRIMARY KEY AUTOINCREMENT,
28
- name TEXT NOT NULL,
29
- callsign TEXT,
30
  device_id TEXT UNIQUE,
31
- group_id INTEGER REFERENCES talkgroups(id),
32
- status TEXT NOT NULL DEFAULT 'offline',
33
- battery INTEGER,
34
- lat REAL,
35
- lng REAL,
36
  last_seen INTEGER
37
  );
38
  CREATE TABLE IF NOT EXISTS gps_pings (
39
- id INTEGER PRIMARY KEY AUTOINCREMENT,
40
- member_id INTEGER NOT NULL REFERENCES members(id) ON DELETE CASCADE,
41
- lat REAL NOT NULL,
42
- lng REAL NOT NULL,
43
- speed REAL,
44
- ts INTEGER NOT NULL
45
  );
46
- CREATE INDEX IF NOT EXISTS idx_pings_member_ts ON gps_pings(member_id, ts);
47
  CREATE TABLE IF NOT EXISTS sos_alerts (
48
- id INTEGER PRIMARY KEY AUTOINCREMENT,
49
- member_id INTEGER NOT NULL REFERENCES members(id),
50
- lat REAL,
51
- lng REAL,
52
- state TEXT NOT NULL DEFAULT 'open', -- open | ack | resolved
53
- ack_by TEXT,
54
  created_at INTEGER NOT NULL,
55
  updated_at INTEGER
56
  );
57
  CREATE TABLE IF NOT EXISTS call_log (
58
- id INTEGER PRIMARY KEY AUTOINCREMENT,
59
- group_id INTEGER NOT NULL REFERENCES talkgroups(id),
60
- member_id INTEGER,
61
- kind TEXT NOT NULL, -- ptt_start | ptt_stop
62
- ts INTEGER NOT NULL
63
  );
 
 
64
  `);
65
 
66
- // ---- first-run seed -------------------------------------------------------
67
- const hasAdmin = db.prepare('SELECT 1 FROM users WHERE username = ?').get('admin');
68
- if (!hasAdmin) {
69
  db.prepare('INSERT INTO users (username, password_hash, role, created_at) VALUES (?, ?, ?, ?)')
70
  .run('admin', bcrypt.hashSync(process.env.ADMIN_PASSWORD || 'admin', 10), 'admin', Date.now());
71
- console.log('[db] created default dispatcher "admin" (password: admin) — change it');
72
  }
73
 
74
- const groupCount = db.prepare('SELECT COUNT(*) AS n FROM talkgroups').get().n;
75
- if (groupCount === 0) {
76
  const ins = db.prepare('INSERT INTO talkgroups (name, color) VALUES (?, ?)');
77
  ins.run('Alpha', '#3b82f6');
78
  ins.run('Bravo', '#f59e0b');
 
8
 
9
  const db = new Database(path.join(DATA_DIR, 'dispatch.db'));
10
  db.pragma('journal_mode = WAL');
 
11
 
12
  db.exec(`
13
  CREATE TABLE IF NOT EXISTS users (
14
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
15
+ username TEXT UNIQUE NOT NULL,
16
  password_hash TEXT NOT NULL,
17
+ role TEXT NOT NULL DEFAULT 'dispatcher',
18
+ created_at INTEGER NOT NULL
19
  );
20
  CREATE TABLE IF NOT EXISTS talkgroups (
21
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
22
+ name TEXT UNIQUE NOT NULL,
23
  color TEXT NOT NULL DEFAULT '#3b82f6'
24
  );
25
  CREATE TABLE IF NOT EXISTS members (
26
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
27
+ name TEXT NOT NULL,
28
+ callsign TEXT,
29
  device_id TEXT UNIQUE,
30
+ group_id INTEGER REFERENCES talkgroups(id),
31
+ status TEXT NOT NULL DEFAULT 'offline',
32
+ battery INTEGER,
33
+ lat REAL,
34
+ lng REAL,
35
  last_seen INTEGER
36
  );
37
  CREATE TABLE IF NOT EXISTS gps_pings (
38
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
39
+ member_id INTEGER NOT NULL REFERENCES members(id),
40
+ lat REAL NOT NULL,
41
+ lng REAL NOT NULL,
42
+ speed REAL,
43
+ ts INTEGER NOT NULL
44
  );
 
45
  CREATE TABLE IF NOT EXISTS sos_alerts (
46
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
47
+ member_id INTEGER NOT NULL REFERENCES members(id),
48
+ lat REAL,
49
+ lng REAL,
50
+ state TEXT NOT NULL DEFAULT 'open',
51
+ ack_by TEXT,
52
  created_at INTEGER NOT NULL,
53
  updated_at INTEGER
54
  );
55
  CREATE TABLE IF NOT EXISTS call_log (
56
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
57
+ group_id INTEGER NOT NULL,
58
+ member_id INTEGER NOT NULL,
59
+ kind TEXT NOT NULL,
60
+ ts INTEGER NOT NULL
61
  );
62
+ CREATE INDEX IF NOT EXISTS idx_pings_member_ts ON gps_pings(member_id, ts);
63
+ CREATE INDEX IF NOT EXISTS idx_sos_state ON sos_alerts(state);
64
  `);
65
 
66
+ if (!db.prepare('SELECT 1 FROM users WHERE username = ?').get('admin')) {
 
 
67
  db.prepare('INSERT INTO users (username, password_hash, role, created_at) VALUES (?, ?, ?, ?)')
68
  .run('admin', bcrypt.hashSync(process.env.ADMIN_PASSWORD || 'admin', 10), 'admin', Date.now());
69
+ console.log('[db] default dispatcher created: admin / admin (change it)');
70
  }
71
 
72
+ if (db.prepare('SELECT COUNT(*) AS n FROM talkgroups').get().n === 0) {
 
73
  const ins = db.prepare('INSERT INTO talkgroups (name, color) VALUES (?, ?)');
74
  ins.run('Alpha', '#3b82f6');
75
  ins.run('Bravo', '#f59e0b');