migrate-sqlite-maildir.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/env node
  2. import crypto from 'node:crypto';
  3. import path from 'node:path';
  4. import { pathToFileURL } from 'node:url';
  5. import { initDatabase } from '../src/db.js';
  6. import { maildirRootFromEnvironment } from '../src/maildir-store.js';
  7. import { migrateInboundMessagesToMaildir } from '../src/maildir-sync.js';
  8. import { loadMailHubEnvironment } from './import-vesta-maildir.js';
  9. export async function runSqliteMaildirMigration({ env = process.env, output = process.stdout } = {}) {
  10. loadMailHubEnvironment({ env });
  11. const dataDir = path.resolve(env.DATA_DIR || path.join(process.cwd(), 'data'));
  12. const maildirRoot = maildirRootFromEnvironment(env);
  13. const secret = String(env.SESSION_SECRET || crypto
  14. .createHash('sha256')
  15. .update(`${env.ADMIN_PASSWORD || 'change-this-admin-password'}:${env.API_TOKEN || ''}`)
  16. .digest('hex'));
  17. initDatabase(dataDir, secret);
  18. let lastReported = 0;
  19. const report = await migrateInboundMessagesToMaildir({
  20. root: maildirRoot,
  21. onProgress(progress) {
  22. if (progress.processed - lastReported < 250) return;
  23. lastReported = progress.processed;
  24. output.write(`Maildir migration progress: processed=${progress.processed} written=${progress.written} reused=${progress.reused}\n`);
  25. }
  26. });
  27. output.write(`Maildir migration complete: processed=${report.processed} written=${report.written} reused=${report.reused}\n`);
  28. return report;
  29. }
  30. function isMainModule() {
  31. const scriptPath = process.argv[1] ? path.resolve(process.argv[1]) : '';
  32. return scriptPath && import.meta.url === pathToFileURL(scriptPath).href;
  33. }
  34. if (isMainModule()) {
  35. runSqliteMaildirMigration().catch((error) => {
  36. console.error(`Maildir migration failed: ${error.message || error}`);
  37. process.exitCode = 1;
  38. });
  39. }