Skip to content

Commit c9caa4b

Browse files
fix 修复初次部署时表初始化问题以及无法加载历史邮箱
1 parent 50a710b commit c9caa4b

2 files changed

Lines changed: 17 additions & 8 deletions

File tree

src/database.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,26 @@ export async function initDatabase(db) {
3333
* @returns {Promise<void>}
3434
*/
3535
async function performFirstTimeSetup(db) {
36-
// 快速检查:如果主表存在,跳过初始化
36+
// 快速检查:如果所有必要表存在,跳过初始化
3737
try {
3838
await db.prepare('SELECT 1 FROM mailboxes LIMIT 1').all();
3939
await db.prepare('SELECT 1 FROM messages LIMIT 1').all();
4040
await db.prepare('SELECT 1 FROM users LIMIT 1').all();
41-
// 所有表都存在,跳过创建
41+
await db.prepare('SELECT 1 FROM user_mailboxes LIMIT 1').all();
42+
await db.prepare('SELECT 1 FROM sent_emails LIMIT 1').all();
43+
// 所有5个必要表都存在,跳过创建
4244
return;
4345
} catch (e) {
44-
// 表不存在,继续初始化
46+
// 有表不存在,继续初始化
47+
console.log('检测到数据库表不完整,开始初始化...');
4548
}
4649

4750
// 创建表结构(仅在表不存在时)
4851
await db.exec("CREATE TABLE IF NOT EXISTS mailboxes (id INTEGER PRIMARY KEY AUTOINCREMENT, address TEXT NOT NULL UNIQUE, local_part TEXT NOT NULL, domain TEXT NOT NULL, password_hash TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP, last_accessed_at TEXT, expires_at TEXT, is_pinned INTEGER DEFAULT 0, can_login INTEGER DEFAULT 0);");
4952
await db.exec("CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY AUTOINCREMENT, mailbox_id INTEGER NOT NULL, sender TEXT NOT NULL, to_addrs TEXT NOT NULL DEFAULT '', subject TEXT NOT NULL, verification_code TEXT, preview TEXT, r2_bucket TEXT NOT NULL DEFAULT 'mail-eml', r2_object_key TEXT NOT NULL DEFAULT '', received_at TEXT DEFAULT CURRENT_TIMESTAMP, is_read INTEGER DEFAULT 0, FOREIGN KEY(mailbox_id) REFERENCES mailboxes(id));");
53+
await db.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, password_hash TEXT, role TEXT NOT NULL DEFAULT 'user', can_send INTEGER NOT NULL DEFAULT 0, mailbox_limit INTEGER NOT NULL DEFAULT 10, created_at TEXT DEFAULT CURRENT_TIMESTAMP);");
54+
await db.exec("CREATE TABLE IF NOT EXISTS user_mailboxes (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, mailbox_id INTEGER NOT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, is_pinned INTEGER NOT NULL DEFAULT 0, UNIQUE(user_id, mailbox_id), FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY(mailbox_id) REFERENCES mailboxes(id) ON DELETE CASCADE);");
55+
await db.exec("CREATE TABLE IF NOT EXISTS sent_emails (id INTEGER PRIMARY KEY AUTOINCREMENT, resend_id TEXT, from_name TEXT, from_addr TEXT NOT NULL, to_addrs TEXT NOT NULL, subject TEXT NOT NULL, html_content TEXT, text_content TEXT, status TEXT DEFAULT 'queued', scheduled_at TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP);");
5056

5157
// 创建索引
5258
await db.exec(`CREATE INDEX IF NOT EXISTS idx_mailboxes_address ON mailboxes(address);`);
@@ -57,10 +63,14 @@ async function performFirstTimeSetup(db) {
5763
await db.exec(`CREATE INDEX IF NOT EXISTS idx_messages_r2_object_key ON messages(r2_object_key);`);
5864
await db.exec(`CREATE INDEX IF NOT EXISTS idx_messages_mailbox_received ON messages(mailbox_id, received_at DESC);`);
5965
await db.exec(`CREATE INDEX IF NOT EXISTS idx_messages_mailbox_received_read ON messages(mailbox_id, received_at DESC, is_read);`);
60-
61-
// 创建用户和发送记录表
62-
await ensureUsersTables(db);
63-
await ensureSentEmailsTable(db);
66+
await db.exec(`CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);`);
67+
await db.exec(`CREATE INDEX IF NOT EXISTS idx_user_mailboxes_user ON user_mailboxes(user_id);`);
68+
await db.exec(`CREATE INDEX IF NOT EXISTS idx_user_mailboxes_mailbox ON user_mailboxes(mailbox_id);`);
69+
await db.exec(`CREATE INDEX IF NOT EXISTS idx_user_mailboxes_user_pinned ON user_mailboxes(user_id, is_pinned DESC);`);
70+
await db.exec(`CREATE INDEX IF NOT EXISTS idx_user_mailboxes_composite ON user_mailboxes(user_id, mailbox_id, is_pinned);`);
71+
await db.exec(`CREATE INDEX IF NOT EXISTS idx_sent_emails_resend_id ON sent_emails(resend_id);`);
72+
await db.exec(`CREATE INDEX IF NOT EXISTS idx_sent_emails_status_created ON sent_emails(status, created_at DESC);`);
73+
await db.exec(`CREATE INDEX IF NOT EXISTS idx_sent_emails_from_addr ON sent_emails(from_addr);`);
6474
}
6575

6676
/**

wrangler.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ database_name = "maill_free_db" #你的d1数据库名称
1010
database_id = "c82663ac-62b6-4ba6-be81-cbe297f2a3dd" # 你的database_id
1111

1212
# 环境变量
13-
[vars]
1413

1514

1615
# 静态资源目录(Workers + Assets)

0 commit comments

Comments
 (0)