Procházet zdrojové kódy

fix: migrate inbound folders before indexing

AI-Co-Authored-By: Codex
chendeben před 1 měsícem
rodič
revize
8beb3cb523
2 změnil soubory, kde provedl 35 přidání a 1 odebrání
  1. 0 1
      src/db.js
  2. 35 0
      test/db.test.js

+ 0 - 1
src/db.js

@@ -307,7 +307,6 @@ export function initDatabase(dataDir, secret = '') {
     CREATE INDEX IF NOT EXISTS idx_inbound_mailboxes_domain_id ON inbound_mailboxes(domain_id);
     CREATE INDEX IF NOT EXISTS idx_inbound_messages_user_received ON inbound_messages(user_id, received_at);
     CREATE INDEX IF NOT EXISTS idx_inbound_messages_mailbox_received ON inbound_messages(mailbox_id, received_at);
-    CREATE INDEX IF NOT EXISTS idx_inbound_messages_mailbox_folder_received ON inbound_messages(mailbox_id, folder, received_at);
     CREATE INDEX IF NOT EXISTS idx_inbound_folders_mailbox ON inbound_folders(mailbox_id, deleted_at);
   `);
   ensureColumn('domains', 'user_id', 'INTEGER');

+ 35 - 0
test/db.test.js

@@ -143,6 +143,41 @@ test('migrates legacy data to the seeded admin user', () => {
   assert.equal(getSmtpCredential(admin.id).username, 'legacy-smtp');
 });
 
+test('migrates legacy inbound messages before creating folder indexes', () => {
+  const dataDir = tempDataDir();
+  const dbPath = path.join(dataDir, 'mailhub.sqlite');
+  const legacy = new DatabaseSync(dbPath);
+  legacy.exec(`
+    CREATE TABLE inbound_messages (
+      id INTEGER PRIMARY KEY AUTOINCREMENT,
+      mailbox_id INTEGER NOT NULL,
+      user_id INTEGER NOT NULL,
+      domain_id INTEGER NOT NULL,
+      sender TEXT NOT NULL DEFAULT '',
+      recipients_json TEXT NOT NULL DEFAULT '[]',
+      subject TEXT NOT NULL DEFAULT '',
+      message_id TEXT NOT NULL DEFAULT '',
+      raw_message TEXT NOT NULL DEFAULT '',
+      text_body TEXT NOT NULL DEFAULT '',
+      html_body TEXT NOT NULL DEFAULT '',
+      preview TEXT NOT NULL DEFAULT '',
+      read_state TEXT NOT NULL DEFAULT 'false',
+      received_at TEXT NOT NULL,
+      created_at TEXT NOT NULL,
+      updated_at TEXT NOT NULL,
+      deleted_at TEXT
+    );
+  `);
+  legacy.close();
+
+  const database = initDatabase(dataDir, 'test-secret');
+  const columns = database.prepare('PRAGMA table_info(inbound_messages)').all().map((column) => column.name);
+  const indexes = database.prepare('PRAGMA index_list(inbound_messages)').all().map((index) => index.name);
+
+  assert.ok(columns.includes('folder'));
+  assert.ok(indexes.includes('idx_inbound_messages_mailbox_folder_received'));
+});
+
 test('migrates legacy send events with engagement tracking disabled', () => {
   const dataDir = tempDataDir();
   const database = initDatabase(dataDir, 'test-secret');