Radish alpha
h
rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
Radicle Heartwood Protocol & Stack
Radicle
Git
radicle: add notification count grouped by repo method
Merged did:key:z6MkkfM3...sVz5 opened 1 year ago

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.

1 file changed +50 -1 259adf7d a7e96131
modified radicle/src/node/notifications/store.rs
@@ -323,7 +323,26 @@ impl<T> Store<T> {
        Ok(count)
    }

-
    /// Get the notification for the given repo.
+
    /// Get the total notification count by repos.
+
    pub fn count_by_repos(
+
        &self,
+
    ) -> Result<impl Iterator<Item = Result<(RepoId, usize), Error>> + '_, 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::<i64, _>("count")? as usize;
+
            let repo = row.try_read::<RepoId, _>("repo")?;
+

+
            Ok((repo, count))
+
        }))
+
    }
+

+
    /// Get the notification count for the given repo.
    pub fn count_by_repo(&self, repo: &RepoId) -> Result<usize, Error> {
        let mut stmt = self
            .db
@@ -424,6 +443,36 @@ mod test {
    }

    #[test]
+
    fn test_count_by_repos() {
+
        let mut db = Store::open(":memory:").unwrap();
+
        let repo1 = arbitrary::gen::<RepoId>(1);
+
        let repo2 = arbitrary::gen::<RepoId>(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 count = db.count_by_repos().unwrap();
+

+
        assert_eq!(count.next().unwrap().unwrap(), (repo1, 2));
+
        assert_eq!(count.next().unwrap().unwrap(), (repo2, 1));
+
    }
+

+
    #[test]
    fn test_branch_notifications() {
        let repo = arbitrary::gen::<RepoId>(1);
        let old = arbitrary::oid();