aboutsummaryrefslogtreecommitdiffstats
path: root/filamento/src/db.rs
diff options
context:
space:
mode:
Diffstat (limited to 'filamento/src/db.rs')
-rw-r--r--filamento/src/db.rs41
1 files changed, 39 insertions, 2 deletions
diff --git a/filamento/src/db.rs b/filamento/src/db.rs
index 36ce7bf..d2c24a2 100644
--- a/filamento/src/db.rs
+++ b/filamento/src/db.rs
@@ -14,7 +14,7 @@ use crate::{
user::User,
};
-#[derive(Clone)]
+#[derive(Clone, Debug)]
pub struct Db {
db: Arc<Mutex<rusqlite::Connection>>,
}
@@ -84,6 +84,7 @@ impl Db {
Ok(())
}
+ // TODO: this is not a 'read' user
pub(crate) async fn read_user(&self, user: JID) -> Result<User, Error> {
let db = self.db().await;
let user_opt = db
@@ -556,6 +557,7 @@ impl Db {
Ok(chats)
}
+ #[tracing::instrument]
async fn read_chat_id(&self, chat: JID) -> Result<Uuid, Error> {
let chat_id = self.db().await.query_row(
"select id from chats where correspondent = ?1",
@@ -579,6 +581,7 @@ impl Db {
}
/// if the chat doesn't already exist, it must be created by calling create_chat() before running this function.
+ #[tracing::instrument]
pub(crate) async fn create_message(
&self,
message: Message,
@@ -587,6 +590,7 @@ impl Db {
) -> Result<(), Error> {
let from_jid = from.as_bare();
let chat_id = self.read_chat_id(chat).await?;
+ tracing::debug!("creating message");
self.db().await.execute("insert into messages (id, body, chat_id, from_jid, from_resource, timestamp, delivery) values (?1, ?2, ?3, ?4, ?5, ?6, ?7)", (&message.id, &message.body.body, &chat_id, &from_jid, &from.resourcepart, &message.timestamp, &message.delivery))?;
Ok(())
}
@@ -596,7 +600,7 @@ impl Db {
let db = self.db().await;
db.execute(
"insert into users (jid) values (?1) on conflict do nothing",
- [&chat],
+ [&bare_chat],
)?;
let id = Uuid::new_v4();
db.execute("insert into chats (id, correspondent, have_chatted) values (?1, ?2, ?3) on conflict do nothing", (id, &bare_chat, false))?;
@@ -614,6 +618,7 @@ impl Db {
}
/// create direct message from incoming. MUST upsert chat and user
+ #[tracing::instrument]
pub(crate) async fn create_message_with_user_resource(
&self,
message: Message,
@@ -624,6 +629,8 @@ impl Db {
from: JID,
) -> Result<(), Error> {
let from_jid = from.as_bare();
+ let chat = chat.as_bare();
+ tracing::debug!("creating resource");
if let Some(resource) = &from.resourcepart {
self.db().await.execute(
"insert into resources (bare_jid, resource) values (?1, ?2) on conflict do nothing",
@@ -634,6 +641,18 @@ impl Db {
Ok(())
}
+ pub(crate) async fn update_message_delivery(
+ &self,
+ message: Uuid,
+ delivery: Delivery,
+ ) -> Result<(), Error> {
+ self.db().await.execute(
+ "update messages set delivery = ?1 where id = ?2",
+ (delivery, message),
+ )?;
+ Ok(())
+ }
+
// pub(crate) async fn read_message(&self, message: Uuid) -> Result<Message, Error> {
// Ok(Message {
// id: Uuid,
@@ -653,6 +672,24 @@ impl Db {
Ok(())
}
+ pub(crate) async fn read_message(&self, message: Uuid) -> Result<Message, Error> {
+ let message = self.db().await.query_row(
+ "select id, from_jid, delivery, timestamp, body from messages where id = ?1",
+ [&message],
+ |row| {
+ Ok(Message {
+ id: row.get(0)?,
+ // TODO: full from
+ from: row.get(1)?,
+ delivery: row.get(2)?,
+ timestamp: row.get(3)?,
+ body: Body { body: row.get(4)? },
+ })
+ },
+ )?;
+ Ok(message)
+ }
+
// TODO: paging
pub(crate) async fn read_message_history(&self, chat: JID) -> Result<Vec<Message>, Error> {
let chat_id = self.read_chat_id(chat).await?;