Nenhuma descrição
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

db.js 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // SQLite data layer + schema.
  2. // Uses Node's built-in node:sqlite (no native compilation needed).
  3. const { DatabaseSync } = require('node:sqlite');
  4. const path = require('path');
  5. const db = new DatabaseSync(process.env.DB_PATH || path.join(__dirname, 'data.db'));
  6. // WAL is preferred but unsupported on some mounted/network filesystems; fall back quietly.
  7. try { db.exec('PRAGMA journal_mode = WAL'); } catch { /* default rollback journal is fine */ }
  8. db.exec('PRAGMA foreign_keys = ON');
  9. db.exec(`
  10. CREATE TABLE IF NOT EXISTS teams (
  11. id TEXT PRIMARY KEY,
  12. name TEXT NOT NULL,
  13. created_at INTEGER NOT NULL
  14. );
  15. CREATE TABLE IF NOT EXISTS users (
  16. id TEXT PRIMARY KEY,
  17. team_id TEXT NOT NULL REFERENCES teams(id),
  18. email TEXT NOT NULL UNIQUE,
  19. pw_hash TEXT NOT NULL,
  20. pw_salt TEXT NOT NULL,
  21. role TEXT NOT NULL DEFAULT 'technician',
  22. mfa_secret TEXT,
  23. mfa_enabled INTEGER NOT NULL DEFAULT 0,
  24. created_at INTEGER NOT NULL
  25. );
  26. CREATE TABLE IF NOT EXISTS sessions_auth (
  27. token TEXT PRIMARY KEY,
  28. user_id TEXT NOT NULL REFERENCES users(id),
  29. mfa_passed INTEGER NOT NULL DEFAULT 0,
  30. created_at INTEGER NOT NULL,
  31. expires_at INTEGER NOT NULL
  32. );
  33. CREATE TABLE IF NOT EXISTS machines (
  34. id TEXT PRIMARY KEY,
  35. team_id TEXT NOT NULL REFERENCES teams(id),
  36. name TEXT NOT NULL,
  37. enroll_token TEXT NOT NULL UNIQUE,
  38. unattended INTEGER NOT NULL DEFAULT 0,
  39. last_seen INTEGER,
  40. created_at INTEGER NOT NULL
  41. );
  42. CREATE TABLE IF NOT EXISTS audit_log (
  43. id INTEGER PRIMARY KEY AUTOINCREMENT,
  44. team_id TEXT NOT NULL,
  45. user_id TEXT,
  46. user_email TEXT,
  47. machine_id TEXT,
  48. machine_name TEXT,
  49. action TEXT NOT NULL,
  50. detail TEXT,
  51. at INTEGER NOT NULL
  52. );
  53. `);
  54. // Migration: optional display name for agents (shown to customers on consent)
  55. try { db.exec('ALTER TABLE users ADD COLUMN name TEXT'); } catch (e) { /* already exists */ }
  56. // Migration: agent active flag (deactivate without deleting)
  57. try { db.exec('ALTER TABLE users ADD COLUMN active INTEGER NOT NULL DEFAULT 1'); } catch (e) { /* exists */ }
  58. // Session report: one row per support session with duration
  59. db.exec(`
  60. CREATE TABLE IF NOT EXISTS sessions_log (
  61. id TEXT PRIMARY KEY,
  62. team_id TEXT NOT NULL,
  63. agent_email TEXT,
  64. agent_name TEXT,
  65. ticket TEXT,
  66. started_at INTEGER NOT NULL,
  67. ended_at INTEGER
  68. );
  69. `);
  70. module.exports = db;