From 69a8ec277551b30005b002720798c39bc74f65ec Mon Sep 17 00:00:00 2001 From: xiaoxixi Date: Tue, 28 Apr 2026 22:13:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(storage):=20=E5=AE=9E=E7=8E=B0=20Message?= =?UTF-8?q?=20CRUD=20=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/storage/mod.rs | 79 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/storage/mod.rs b/src/storage/mod.rs index c844177..bf54ec8 100644 --- a/src/storage/mod.rs +++ b/src/storage/mod.rs @@ -255,4 +255,83 @@ impl Storage { None => Ok(None), } } + + pub async fn append_message(&self, session_id: &str, msg: &crate::storage::message::MessageMeta) -> Result { + sqlx::query( + r#" + INSERT INTO messages (id, session_id, seq, role, content, media_refs, tool_call_id, tool_name, tool_calls, created_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + "#, + ) + .bind(&msg.id) + .bind(session_id) + .bind(msg.seq) + .bind(&msg.role) + .bind(&msg.content) + .bind(&msg.media_refs) + .bind(&msg.tool_call_id) + .bind(&msg.tool_name) + .bind(&msg.tool_calls) + .bind(msg.created_at) + .execute(self.pool()) + .await?; + + Ok(msg.seq) + } + + pub async fn append_messages( + &self, + session_id: &str, + msgs: &[crate::storage::message::MessageMeta], + ) -> Result, StorageError> { + let mut seqs = Vec::with_capacity(msgs.len()); + for msg in msgs { + let seq = self.append_message(session_id, msg).await?; + seqs.push(seq); + } + Ok(seqs) + } + + pub async fn load_messages( + &self, + session_id: &str, + from_seq: i64, + ) -> Result, StorageError> { + let rows = sqlx::query( + r#" + SELECT id, session_id, seq, role, content, media_refs, tool_call_id, tool_name, tool_calls, created_at + FROM messages + WHERE session_id = ? AND seq >= ? + ORDER BY seq ASC + "#, + ) + .bind(session_id) + .bind(from_seq) + .fetch_all(self.pool()) + .await?; + + Ok(rows + .into_iter() + .map(|row| crate::storage::message::MessageMeta { + id: row.get("id"), + session_id: row.get("session_id"), + seq: row.get("seq"), + role: row.get("role"), + content: row.get("content"), + media_refs: row.get("media_refs"), + tool_call_id: row.get("tool_call_id"), + tool_name: row.get("tool_name"), + tool_calls: row.get("tool_calls"), + created_at: row.get("created_at"), + }) + .collect()) + } + + pub async fn clear_messages(&self, session_id: &str) -> Result<(), StorageError> { + sqlx::query(r#"DELETE FROM messages WHERE session_id = ?"#) + .bind(session_id) + .execute(self.pool()) + .await?; + Ok(()) + } }