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(()) + } }