Skip to content

Commit

Permalink
fix(core/database): store member during permission query
Browse files Browse the repository at this point in the history
  • Loading branch information
insertish committed Oct 20, 2023
1 parent a5e5d50 commit d012a6d
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 11 deletions.
78 changes: 72 additions & 6 deletions crates/core/database/src/models/servers/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -455,9 +455,12 @@ impl SystemMessageChannels {
mod tests {
use std::collections::HashMap;

use revolt_permissions::OverrideField;
use revolt_permissions::{calculate_server_permissions, ChannelPermission, OverrideField};

use crate::{Role, Server, User};
use crate::{
util::permissions::DatabasePermissionQuery, Channel, Member, MemberCompositeKey, Role,
Server, User,
};

#[async_std::test]
async fn permissions() {
Expand All @@ -474,12 +477,26 @@ mod tests {
.await
.unwrap();

let server = Server {
let server_id = ulid::Ulid::new().to_string();

let channel = Channel::TextChannel {
id: ulid::Ulid::new().to_string(),
owner: owner.id,
server: server_id.clone(),
name: "Channel".to_string(),
description: None,
icon: None,
last_message_id: None,
default_permissions: None,
role_permissions: HashMap::new(),
nsfw: false,
};

let server = Server {
id: server_id,
owner: owner.id.clone(),
name: "My Server".to_string(),
description: None,
channels: vec![],
channels: vec![channel.id()],
categories: None,
system_messages: None,
roles: HashMap::from([
Expand All @@ -488,7 +505,7 @@ mod tests {
Role {
name: "Moderator".to_string(),
permissions: OverrideField {
a: 545270208,
a: 545270208, // TODO: explicit
..Default::default()
},
colour: None,
Expand Down Expand Up @@ -516,7 +533,56 @@ mod tests {
discoverable: false,
};

// TODO: proper creation
db.insert_channel(&channel).await.unwrap();
server.create(&db).await.unwrap();

db.insert_member(&Member {
id: MemberCompositeKey {
user: owner.id.clone(),
server: server.id.clone(),
},
roles: vec!["01FBF9DNHSRPVTWFMNB3JNB8FK".to_string()],
..Default::default()
})
.await
.unwrap();

db.insert_member(&Member {
id: MemberCompositeKey {
user: moderator.id.clone(),
server: server.id.clone(),
},
roles: vec!["01F9HFTSBWTNA2F4TMSV7VM3FG".to_string()],
..Default::default()
})
.await
.unwrap();

db.insert_member(&Member {
id: MemberCompositeKey {
user: user.id.clone(),
server: server.id.clone(),
},
..Default::default()
})
.await
.unwrap();

let mut query = DatabasePermissionQuery::new(&db, &owner).server(&server);
assert!(calculate_server_permissions(&mut query)
.await
.has_channel_permission(ChannelPermission::GrantAllSafe));

let mut query = DatabasePermissionQuery::new(&db, &moderator).server(&server);
assert!(calculate_server_permissions(&mut query)
.await
.has_channel_permission(ChannelPermission::BanMembers));

let mut query = DatabasePermissionQuery::new(&db, &user).server(&server);
assert!(!calculate_server_permissions(&mut query)
.await
.has_channel_permission(ChannelPermission::BanMembers));
});
}
}
2 changes: 1 addition & 1 deletion crates/core/database/src/util/idempotency.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::num::NonZeroUsize;

use revolt_result::{create_error, Error, Result};
use revolt_result::{create_error, Result};

use async_std::sync::Mutex;
use once_cell::sync::Lazy;
Expand Down
12 changes: 8 additions & 4 deletions crates/core/database/src/util/permissions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,15 @@ impl PermissionQuery for DatabasePermissionQuery<'_> {
if let Some(server) = &self.server {
if self.member.is_some() {
true
} else if let Ok(member) = self
.database
.fetch_member(&server.id, &self.perspective.id)
.await
{
self.member = Some(Cow::Owned(member));
true
} else {
self.database
.fetch_member(&server.id, &self.perspective.id)
.await
.is_ok()
false
}
} else {
false
Expand Down

0 comments on commit d012a6d

Please sign in to comment.