feat: 支持平台消息id和回复id,同时进行表迁移

This commit is contained in:
digua
2026-01-09 00:04:21 +08:00
committed by digua
parent d7291768b1
commit 32fd5139d4
10 changed files with 121 additions and 19 deletions

View File

@@ -181,6 +181,8 @@ function createDatabaseWithoutIndexes(sessionId: string): Database.Database {
ts INTEGER NOT NULL,
type INTEGER NOT NULL,
content TEXT,
reply_to_message_id TEXT DEFAULT NULL,
platform_message_id TEXT DEFAULT NULL,
FOREIGN KEY(sender_id) REFERENCES member(id)
);
`)
@@ -195,6 +197,7 @@ function createIndexes(db: Database.Database): void {
db.exec(`
CREATE INDEX IF NOT EXISTS idx_message_ts ON message(ts);
CREATE INDEX IF NOT EXISTS idx_message_sender ON message(sender_id);
CREATE INDEX IF NOT EXISTS idx_message_platform_id ON message(platform_message_id);
CREATE INDEX IF NOT EXISTS idx_member_name_history_member_id ON member_name_history(member_id);
`)
}
@@ -268,8 +271,8 @@ export async function streamImport(filePath: string, requestId: string): Promise
`)
const getMemberId = db.prepare(`SELECT id FROM member WHERE platform_id = ?`)
const insertMessage = db.prepare(`
INSERT INTO message (sender_id, sender_account_name, sender_group_nickname, ts, type, content)
VALUES (?, ?, ?, ?, ?, ?)
INSERT INTO message (sender_id, sender_account_name, sender_group_nickname, ts, type, content, reply_to_message_id, platform_message_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`)
const insertNameHistory = db.prepare(`
INSERT INTO member_name_history (member_id, name_type, name, start_ts, end_ts) VALUES (?, ?, ?, ?, ?)
@@ -467,7 +470,9 @@ export async function streamImport(filePath: string, requestId: string): Promise
msg.senderGroupNickname || null,
msg.timestamp,
msg.type,
safeContent
safeContent,
msg.replyToMessageId || null,
msg.platformMessageId || null
)
messageInsertTime += Date.now() - t0
messageCountInBatch++

View File

@@ -21,6 +21,9 @@ export interface MessageResult {
content: string
timestamp: number
type: number
replyToMessageId: string | null
replyToContent: string | null
replyToSenderName: string | null
}
/**
@@ -53,6 +56,9 @@ interface DbMessageRow {
content: string
timestamp: number
type: number
reply_to_message_id: string | null
replyToContent: string | null
replyToSenderName: string | null
}
/**
@@ -79,6 +85,9 @@ function sanitizeMessageRow(row: DbMessageRow): MessageResult {
content: row.content != null ? String(row.content) : '',
timestamp: Number(row.timestamp),
type: Number(row.type),
replyToMessageId: row.reply_to_message_id || null,
replyToContent: row.replyToContent || null,
replyToSenderName: row.replyToSenderName || null,
}
}
@@ -156,9 +165,14 @@ export function getRecentMessages(
m.avatar,
msg.content,
msg.ts as timestamp,
msg.type
msg.type,
msg.reply_to_message_id,
reply_msg.content as replyToContent,
COALESCE(reply_m.group_nickname, reply_m.account_name, reply_m.platform_id) as replyToSenderName
FROM message msg
JOIN member m ON msg.sender_id = m.id
LEFT JOIN message reply_msg ON msg.reply_to_message_id = reply_msg.platform_message_id
LEFT JOIN member reply_m ON reply_msg.sender_id = reply_m.id
WHERE 1=1
${timeCondition}
${SYSTEM_FILTER}
@@ -218,9 +232,14 @@ export function getAllRecentMessages(
m.avatar,
msg.content,
msg.ts as timestamp,
msg.type
msg.type,
msg.reply_to_message_id,
reply_msg.content as replyToContent,
COALESCE(reply_m.group_nickname, reply_m.account_name, reply_m.platform_id) as replyToSenderName
FROM message msg
JOIN member m ON msg.sender_id = m.id
LEFT JOIN message reply_msg ON msg.reply_to_message_id = reply_msg.platform_message_id
LEFT JOIN member reply_m ON reply_msg.sender_id = reply_m.id
WHERE 1=1
${timeCondition}
ORDER BY msg.ts DESC
@@ -296,9 +315,14 @@ export function searchMessages(
m.avatar,
msg.content,
msg.ts as timestamp,
msg.type
msg.type,
msg.reply_to_message_id,
reply_msg.content as replyToContent,
COALESCE(reply_m.group_nickname, reply_m.account_name, reply_m.platform_id) as replyToSenderName
FROM message msg
JOIN member m ON msg.sender_id = m.id
LEFT JOIN message reply_msg ON msg.reply_to_message_id = reply_msg.platform_message_id
LEFT JOIN member reply_m ON reply_msg.sender_id = reply_m.id
WHERE ${keywordCondition}
${timeCondition}
${senderCondition}
@@ -381,9 +405,14 @@ export function getMessageContext(
m.avatar,
msg.content,
msg.ts as timestamp,
msg.type
msg.type,
msg.reply_to_message_id,
reply_msg.content as replyToContent,
COALESCE(reply_m.group_nickname, reply_m.account_name, reply_m.platform_id) as replyToSenderName
FROM message msg
JOIN member m ON msg.sender_id = m.id
LEFT JOIN message reply_msg ON msg.reply_to_message_id = reply_msg.platform_message_id
LEFT JOIN member reply_m ON reply_msg.sender_id = reply_m.id
WHERE msg.id IN (${placeholders})
ORDER BY msg.id ASC
`
@@ -435,9 +464,14 @@ export function getMessagesBefore(
m.avatar,
msg.content,
msg.ts as timestamp,
msg.type
msg.type,
msg.reply_to_message_id,
reply_msg.content as replyToContent,
COALESCE(reply_m.group_nickname, reply_m.account_name, reply_m.platform_id) as replyToSenderName
FROM message msg
JOIN member m ON msg.sender_id = m.id
LEFT JOIN message reply_msg ON msg.reply_to_message_id = reply_msg.platform_message_id
LEFT JOIN member reply_m ON reply_msg.sender_id = reply_m.id
WHERE msg.id < ?
${timeCondition}
${keywordCondition}
@@ -500,9 +534,14 @@ export function getMessagesAfter(
m.avatar,
msg.content,
msg.ts as timestamp,
msg.type
msg.type,
msg.reply_to_message_id,
reply_msg.content as replyToContent,
COALESCE(reply_m.group_nickname, reply_m.account_name, reply_m.platform_id) as replyToSenderName
FROM message msg
JOIN member m ON msg.sender_id = m.id
LEFT JOIN message reply_msg ON msg.reply_to_message_id = reply_msg.platform_message_id
LEFT JOIN member reply_m ON reply_msg.sender_id = reply_m.id
WHERE msg.id > ?
${timeCondition}
${keywordCondition}
@@ -585,9 +624,14 @@ export function getConversationBetween(
m.avatar,
msg.content,
msg.ts as timestamp,
msg.type
msg.type,
msg.reply_to_message_id,
reply_msg.content as replyToContent,
COALESCE(reply_m.group_nickname, reply_m.account_name, reply_m.platform_id) as replyToSenderName
FROM message msg
JOIN member m ON msg.sender_id = m.id
LEFT JOIN message reply_msg ON msg.reply_to_message_id = reply_msg.platform_message_id
LEFT JOIN member reply_m ON reply_msg.sender_id = reply_m.id
WHERE msg.sender_id IN (?, ?)
${timeCondition}
AND msg.content IS NOT NULL AND msg.content != ''