diff --git a/server/.sqlx/query-b39147b9d06171cb742141eda4675688cb702fb284758b1224ed3aa2d7f3b3d9.json b/server/.sqlx/query-b39147b9d06171cb742141eda4675688cb702fb284758b1224ed3aa2d7f3b3d9.json new file mode 100644 index 0000000..b5ed80a --- /dev/null +++ b/server/.sqlx/query-b39147b9d06171cb742141eda4675688cb702fb284758b1224ed3aa2d7f3b3d9.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE\n post\nSET\n is_read = $1\nWHERE\n uid = $2\n", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Bool", + "Text" + ] + }, + "nullable": [] + }, + "hash": "b39147b9d06171cb742141eda4675688cb702fb284758b1224ed3aa2d7f3b3d9" +} diff --git a/server/sql/set_unread.sql b/server/sql/set_unread.sql new file mode 100644 index 0000000..a99e69c --- /dev/null +++ b/server/sql/set_unread.sql @@ -0,0 +1,6 @@ +UPDATE + post +SET + is_read = $1 +WHERE + uid = $2 diff --git a/server/src/graphql.rs b/server/src/graphql.rs index 90c6082..ca3e5ad 100644 --- a/server/src/graphql.rs +++ b/server/src/graphql.rs @@ -272,11 +272,14 @@ impl Mutation { unread: bool, ) -> Result { let nm = ctx.data_unchecked::(); - info!("set_read_status({query}, {unread})"); - if unread { - nm.tag_add("unread", &format!("{query}"))?; - } else { - nm.tag_remove("unread", &format!("{query}"))?; + let pool = ctx.data_unchecked::(); + + for q in query.split_whitespace() { + if newsreader::is_newsreader_thread(&q) { + newsreader::set_read_status(pool, &q, unread).await?; + } else { + nm::set_read_status(nm, q, unread).await?; + } } Ok(true) } diff --git a/server/src/newsreader.rs b/server/src/newsreader.rs index f186d29..ea227f2 100644 --- a/server/src/newsreader.rs +++ b/server/src/newsreader.rs @@ -250,6 +250,7 @@ pub async fn thread(pool: &PgPool, thread_id: String) -> Result, + uid: Option, remainder: Vec, } @@ -258,6 +259,7 @@ impl FromStr for Query { fn from_str(s: &str) -> Result { let mut unread_only = false; let mut site = None; + let mut uid = None; let mut remainder = Vec::new(); let site_prefix = format!("tag:{TAG_PREFIX}"); for word in s.split_whitespace() { @@ -265,6 +267,8 @@ impl FromStr for Query { unread_only = true } else if word.starts_with(&site_prefix) { site = Some(word[site_prefix.len()..].to_string()) + } else if word.starts_with(THREAD_PREFIX) { + uid = Some(word[THREAD_PREFIX.len()..].to_string()) } else { remainder.push(word.to_string()); } @@ -272,7 +276,20 @@ impl FromStr for Query { Ok(Query { unread_only, site, + uid, remainder, }) } } + +pub async fn set_read_status<'ctx>( + pool: &PgPool, + query: &str, + unread: bool, +) -> Result { + let query: Query = query.parse()?; + sqlx::query_file!("sql/set_unread.sql", !unread, query.uid) + .execute(pool) + .await?; + Ok(true) +} diff --git a/server/src/nm.rs b/server/src/nm.rs index 70fdecd..9e9a6d0 100644 --- a/server/src/nm.rs +++ b/server/src/nm.rs @@ -755,7 +755,7 @@ fn render_content_type_tree(m: &ParsedMail) -> String { pub async fn set_read_status<'ctx>( nm: &Notmuch, - query: String, + query: &str, unread: bool, ) -> Result { if unread {