feat(storage): 实现 Message CRUD 操作
This commit is contained in:
parent
eeb8a77ac8
commit
69a8ec2775
@ -255,4 +255,83 @@ impl Storage {
|
|||||||
None => Ok(None),
|
None => Ok(None),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn append_message(&self, session_id: &str, msg: &crate::storage::message::MessageMeta) -> Result<i64, StorageError> {
|
||||||
|
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<Vec<i64>, 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<Vec<crate::storage::message::MessageMeta>, 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(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user