From a7e96131ce6e9effb304594ad7e7b9dac486a2e0 Mon Sep 17 00:00:00 2001 From: Sebastian Martinez Date: Fri, 15 Nov 2024 13:00:41 +0100 Subject: [PATCH] radicle: add notification count grouped by repo While the total notification count and the notification count by repo are needed, for most UIs users will want to see the total notification count grouped by repo. This new method will provide this without the need of checking all possible repos to see if they have notifications. --- radicle/src/node/notifications/store.rs | 56 ++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/radicle/src/node/notifications/store.rs b/radicle/src/node/notifications/store.rs index 614037a1..69ec83f7 100644 --- a/radicle/src/node/notifications/store.rs +++ b/radicle/src/node/notifications/store.rs @@ -323,7 +323,26 @@ impl Store { Ok(count) } - /// Get the notification for the given repo. + /// Get the total notification count by repos. + pub fn counts_by_repo( + &self, + ) -> Result> + '_, Error> { + let stmt = self.db.prepare( + "SELECT repo, COUNT(*) as count + FROM `repository-notifications` + GROUP BY repo", + )?; + + Ok(stmt.into_iter().map(|row| { + let row = row?; + let count = row.try_read::("count")? as usize; + let repo = row.try_read::("repo")?; + + Ok((repo, count)) + })) + } + + /// Get the notification count for the given repo. pub fn count_by_repo(&self, repo: &RepoId) -> Result { let mut stmt = self .db @@ -423,6 +442,41 @@ mod test { assert_eq!(db.count_by_repo(&repo).unwrap(), 0); } + #[test] + fn test_count_by_repos() { + let mut db = Store::open(":memory:").unwrap(); + let repo1 = arbitrary::gen::(1); + let repo2 = arbitrary::gen::(1); + let oid = arbitrary::oid(); + let time = LocalTime::from_millis(32188142); + + let update1 = RefUpdate::Created { + name: refname!("refs/heads/feature/1"), + oid, + }; + let update2 = RefUpdate::Created { + name: refname!("refs/heads/feature/2"), + oid, + }; + let update3 = RefUpdate::Created { + name: refname!("refs/heads/feature/3"), + oid, + }; + assert!(db.insert(&repo1, &update1, time).unwrap()); + assert!(db.insert(&repo1, &update2, time).unwrap()); + assert!(db.insert(&repo2, &update3, time).unwrap()); + + let mut counts = db + .counts_by_repo() + .unwrap() + .collect::, _>>() + .unwrap(); + counts.sort(); + + assert_eq!(counts.first().unwrap(), &(repo1, 2)); + assert_eq!(counts.last().unwrap(), &(repo2, 1)); + } + #[test] fn test_branch_notifications() { let repo = arbitrary::gen::(1);