database.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.initDatabase = initDatabase;
  7. const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
  8. const path_1 = __importDefault(require("path"));
  9. const fs_1 = __importDefault(require("fs"));
  10. function initDatabase(storageDir) {
  11. // 确保 storage 目录存在
  12. if (!fs_1.default.existsSync(storageDir)) {
  13. fs_1.default.mkdirSync(storageDir, { recursive: true });
  14. }
  15. const dbPath = path_1.default.join(storageDir, "data.db");
  16. const db = new better_sqlite3_1.default(dbPath);
  17. // WAL 模式提升并发读取
  18. db.pragma("journal_mode = WAL");
  19. db.pragma("foreign_keys = ON");
  20. // 建表
  21. db.exec(`
  22. CREATE TABLE IF NOT EXISTS templates (
  23. id TEXT PRIMARY KEY,
  24. name TEXT NOT NULL,
  25. manifest TEXT NOT NULL,
  26. created_at TEXT NOT NULL DEFAULT (datetime('now')),
  27. updated_at TEXT NOT NULL DEFAULT (datetime('now'))
  28. );
  29. CREATE TABLE IF NOT EXISTS creatives (
  30. id TEXT PRIMARY KEY,
  31. name TEXT NOT NULL,
  32. template_id TEXT NOT NULL REFERENCES templates(id),
  33. theme TEXT NOT NULL DEFAULT '{}',
  34. status TEXT NOT NULL DEFAULT 'draft',
  35. created_at TEXT NOT NULL DEFAULT (datetime('now')),
  36. updated_at TEXT NOT NULL DEFAULT (datetime('now'))
  37. );
  38. CREATE TABLE IF NOT EXISTS creative_assets (
  39. id INTEGER PRIMARY KEY AUTOINCREMENT,
  40. creative_id TEXT NOT NULL REFERENCES creatives(id) ON DELETE CASCADE,
  41. file_key TEXT NOT NULL,
  42. file_name TEXT NOT NULL,
  43. file_path TEXT NOT NULL,
  44. file_size INTEGER,
  45. is_required INTEGER NOT NULL DEFAULT 1,
  46. created_at TEXT NOT NULL DEFAULT (datetime('now'))
  47. );
  48. CREATE TABLE IF NOT EXISTS builds (
  49. id TEXT PRIMARY KEY,
  50. creative_id TEXT NOT NULL REFERENCES creatives(id) ON DELETE CASCADE,
  51. status TEXT NOT NULL DEFAULT 'pending',
  52. platforms TEXT NOT NULL,
  53. theme_snapshot TEXT NOT NULL,
  54. results TEXT,
  55. error_log TEXT,
  56. started_at TEXT,
  57. finished_at TEXT,
  58. created_at TEXT NOT NULL DEFAULT (datetime('now'))
  59. );
  60. CREATE INDEX IF NOT EXISTS idx_creatives_template ON creatives(template_id);
  61. CREATE INDEX IF NOT EXISTS idx_builds_creative ON builds(creative_id);
  62. CREATE INDEX IF NOT EXISTS idx_creative_assets_creative ON creative_assets(creative_id);
  63. `);
  64. console.log("[db] Database initialized at", dbPath);
  65. return db;
  66. }
  67. //# sourceMappingURL=database.js.map