From 4f48b390f786a42cbde19fe2291011a8fb7b7339 Mon Sep 17 00:00:00 2001 From: oxalica Date: Tue, 10 Sep 2024 09:33:59 -0400 Subject: [PATCH] feat(webapi): include `member_permission` in `RoomMetadata` This is currently only included by `room_list` endpoint with authentication. --- blah-types/src/lib.rs | 2 ++ blahd/src/lib.rs | 7 +++++-- blahd/tests/webapi.rs | 21 ++++++++++++++++----- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/blah-types/src/lib.rs b/blah-types/src/lib.rs index cfb0c30..18b93f4 100644 --- a/blah-types/src/lib.rs +++ b/blah-types/src/lib.rs @@ -329,6 +329,8 @@ pub struct RoomMetadata { /// This may or may not be a precise number. #[serde(skip_serializing_if = "Option::is_none")] pub unseen_cnt: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub member_permission: Option, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] diff --git a/blahd/src/lib.rs b/blahd/src/lib.rs index 9923fc1..6cb379a 100644 --- a/blahd/src/lib.rs +++ b/blahd/src/lib.rs @@ -212,6 +212,7 @@ async fn room_list( let last_seen_cid = Some(row.get::<_, Id>("last_seen_cid")?).filter(|cid| cid.0 != 0); let unseen_cnt = row.get("unseen_cnt").ok(); + let member_permission = row.get("member_perm").ok(); Ok(RoomMetadata { rid, title, @@ -219,6 +220,7 @@ async fn room_list( last_item, last_seen_cid, unseen_cnt, + member_permission, }) })? .collect::, _>>()?; @@ -252,7 +254,7 @@ async fn room_list( query( r" SELECT - `rid`, `title`, `attrs`, `last_seen_cid`, + `rid`, `title`, `attrs`, `last_seen_cid`, `room_member`.`permission` AS `member_perm`, `cid`, `last_author`.`userkey`, `timestamp`, `nonce`, `sig`, `rich_text` FROM `user` JOIN `room_member` USING (`uid`) @@ -277,7 +279,7 @@ async fn room_list( query( r" SELECT - `rid`, `title`, `attrs`, `last_seen_cid`, + `rid`, `title`, `attrs`, `last_seen_cid`, `room_member`.`permission` AS `member_perm`, `cid`, `last_author`.`userkey`, `timestamp`, `nonce`, `sig`, `rich_text`, (SELECT COUNT(*) FROM `room_item` AS `unseen_item` @@ -456,6 +458,7 @@ async fn room_get_metadata( last_item: None, last_seen_cid: None, unseen_cnt: None, + member_permission: None, })) } diff --git a/blahd/tests/webapi.rs b/blahd/tests/webapi.rs index 9a346ca..73f0310 100644 --- a/blahd/tests/webapi.rs +++ b/blahd/tests/webapi.rs @@ -265,6 +265,7 @@ async fn room_create_get(server: Server, ref mut rng: impl RngCore, #[case] publ last_item: None, last_seen_cid: None, unseen_cnt: None, + member_permission: None, }; // Alice has permission. @@ -300,8 +301,15 @@ async fn room_create_get(server: Server, ref mut rng: impl RngCore, #[case] publ } // The room appears in public list only when it is public. - let expect_list = |has: bool| RoomList { - rooms: has.then(|| room_meta.clone()).into_iter().collect(), + let expect_list = |has: bool, perm: Option| RoomList { + rooms: if has { + vec![RoomMetadata { + member_permission: perm, + ..room_meta.clone() + }] + } else { + Vec::new() + }, skip_token: None, }; assert_eq!( @@ -309,7 +317,7 @@ async fn room_create_get(server: Server, ref mut rng: impl RngCore, #[case] publ .get::("/room?filter=public", None) .await .unwrap(), - expect_list(public), + expect_list(public, None), ); // Joined rooms endpoint always require authentication. @@ -321,13 +329,13 @@ async fn room_create_get(server: Server, ref mut rng: impl RngCore, #[case] publ .get::("/room?filter=joined", Some(&auth(&ALICE_PRIV, rng))) .await .unwrap(); - assert_eq!(got_joined, expect_list(true)); + assert_eq!(got_joined, expect_list(true, Some(MemberPermission::ALL))); let got_joined = server .get::("/room?filter=joined", Some(&auth(&BOB_PRIV, rng))) .await .unwrap(); - assert_eq!(got_joined, expect_list(false)); + assert_eq!(got_joined, expect_list(false, None)); } #[rstest] @@ -551,6 +559,7 @@ async fn room_item_post_read(server: Server, ref mut rng: impl RngCore) { async fn last_seen_item(server: Server, ref mut rng: impl RngCore) { let title = "public room"; let attrs = RoomAttrs::PUBLIC_READABLE | RoomAttrs::PUBLIC_JOINABLE; + let member_perm = MemberPermission::ALL; let rid = server.create_room(&ALICE_PRIV, attrs, title).await.unwrap(); server .join_room(rid, &BOB_PRIV, MemberPermission::MAX_SELF_ADD) @@ -575,6 +584,7 @@ async fn last_seen_item(server: Server, ref mut rng: impl RngCore) { last_item: Some(alice_chat2.clone()), last_seen_cid: None, unseen_cnt: Some(2), + member_permission: Some(member_perm), }], skip_token: None, } @@ -607,6 +617,7 @@ async fn last_seen_item(server: Server, ref mut rng: impl RngCore) { last_item: Some(alice_chat2.clone()), last_seen_cid: Some(alice_chat1.cid), unseen_cnt: Some(1), + member_permission: Some(member_perm), }], skip_token: None, }