mirror of
https://github.com/Blah-IM/blahrs.git
synced 2025-05-01 00:31:09 +00:00
feat(webapi): include member_permission
in RoomMetadata
This is currently only included by `room_list` endpoint with authentication.
This commit is contained in:
parent
5eeb12c294
commit
4f48b390f7
3 changed files with 23 additions and 7 deletions
|
@ -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<u64>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub member_permission: Option<MemberPermission>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
|
|
|
@ -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::<Result<Vec<_>, _>>()?;
|
||||
|
@ -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,
|
||||
}))
|
||||
}
|
||||
|
||||
|
|
|
@ -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<MemberPermission>| 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::<RoomList>("/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::<RoomList>("/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::<RoomList>("/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,
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue