Add mark read/unread support for news

This commit is contained in:
Bill Thiede 2024-07-22 14:43:05 -07:00
parent 4ee34444ae
commit 831466ddda
5 changed files with 47 additions and 6 deletions

View File

@ -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"
}

View File

@ -0,0 +1,6 @@
UPDATE
post
SET
is_read = $1
WHERE
uid = $2

View File

@ -272,11 +272,14 @@ impl Mutation {
unread: bool, unread: bool,
) -> Result<bool, Error> { ) -> Result<bool, Error> {
let nm = ctx.data_unchecked::<Notmuch>(); let nm = ctx.data_unchecked::<Notmuch>();
info!("set_read_status({query}, {unread})"); let pool = ctx.data_unchecked::<PgPool>();
if unread {
nm.tag_add("unread", &format!("{query}"))?; for q in query.split_whitespace() {
} else { if newsreader::is_newsreader_thread(&q) {
nm.tag_remove("unread", &format!("{query}"))?; newsreader::set_read_status(pool, &q, unread).await?;
} else {
nm::set_read_status(nm, q, unread).await?;
}
} }
Ok(true) Ok(true)
} }

View File

@ -250,6 +250,7 @@ pub async fn thread(pool: &PgPool, thread_id: String) -> Result<Thread, ServerEr
struct Query { struct Query {
unread_only: bool, unread_only: bool,
site: Option<String>, site: Option<String>,
uid: Option<String>,
remainder: Vec<String>, remainder: Vec<String>,
} }
@ -258,6 +259,7 @@ impl FromStr for Query {
fn from_str(s: &str) -> Result<Self, Self::Err> { fn from_str(s: &str) -> Result<Self, Self::Err> {
let mut unread_only = false; let mut unread_only = false;
let mut site = None; let mut site = None;
let mut uid = None;
let mut remainder = Vec::new(); let mut remainder = Vec::new();
let site_prefix = format!("tag:{TAG_PREFIX}"); let site_prefix = format!("tag:{TAG_PREFIX}");
for word in s.split_whitespace() { for word in s.split_whitespace() {
@ -265,6 +267,8 @@ impl FromStr for Query {
unread_only = true unread_only = true
} else if word.starts_with(&site_prefix) { } else if word.starts_with(&site_prefix) {
site = Some(word[site_prefix.len()..].to_string()) site = Some(word[site_prefix.len()..].to_string())
} else if word.starts_with(THREAD_PREFIX) {
uid = Some(word[THREAD_PREFIX.len()..].to_string())
} else { } else {
remainder.push(word.to_string()); remainder.push(word.to_string());
} }
@ -272,7 +276,20 @@ impl FromStr for Query {
Ok(Query { Ok(Query {
unread_only, unread_only,
site, site,
uid,
remainder, remainder,
}) })
} }
} }
pub async fn set_read_status<'ctx>(
pool: &PgPool,
query: &str,
unread: bool,
) -> Result<bool, ServerError> {
let query: Query = query.parse()?;
sqlx::query_file!("sql/set_unread.sql", !unread, query.uid)
.execute(pool)
.await?;
Ok(true)
}

View File

@ -755,7 +755,7 @@ fn render_content_type_tree(m: &ParsedMail) -> String {
pub async fn set_read_status<'ctx>( pub async fn set_read_status<'ctx>(
nm: &Notmuch, nm: &Notmuch,
query: String, query: &str,
unread: bool, unread: bool,
) -> Result<bool, ServerError> { ) -> Result<bool, ServerError> {
if unread { if unread {