Switch guild to new permission system.

This commit is contained in:
Paul Makles
2020-04-09 16:26:41 +01:00
parent 28fa2aad6c
commit e92b686410
3 changed files with 25 additions and 53 deletions

View File

@@ -1,48 +1,6 @@
use bson::doc;
use serde::{Deserialize, Serialize};
use super::get_collection;
use mongodb::options::FindOneOptions;
pub fn find_member_permissions<C: Into<Option<String>>>(
id: String,
guild: String,
_channel: C,
) -> u32 {
let col = get_collection("guilds");
match col.find_one(
doc! {
"_id": &guild,
"members": {
"$elemMatch": {
"id": &id,
}
}
},
FindOneOptions::builder()
.projection(doc! {
"members.$": 1,
"owner": 1,
"default_permissions": 1,
})
.build(),
) {
Ok(result) => {
if let Some(doc) = result {
if doc.get_str("owner").unwrap() == id {
return u32::MAX;
}
doc.get_i32("default_permissions").unwrap() as u32
} else {
0
}
}
Err(_) => 0,
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Member {
pub id: String,

View File

@@ -11,8 +11,11 @@ use crate::database::guild::Guild;
pub struct GuildRef {
#[serde(rename = "_id")]
pub id: String,
pub name: String,
pub description: String,
pub owner: String,
pub channels: Vec<String>,
pub default_permissions: i32,
}
@@ -22,7 +25,10 @@ impl GuildRef {
doc! { "_id": id },
FindOneOptions::builder()
.projection(doc! {
"name": 1,
"description": 1,
"owner": 1,
"channels": 1,
"default_permissions": 1
})
.build(),

View File

@@ -1,17 +1,27 @@
use super::channel::ChannelType;
use super::Response;
use crate::database::{
self,
channel::Channel,
guild::{find_member_permissions, Guild},
};
use crate::database::{self, channel::Channel, PermissionCalculator};
use crate::guards::auth::UserRef;
use crate::guards::guild::GuildRef;
use bson::{doc, from_bson, Bson};
use rocket_contrib::json::Json;
use serde::{Deserialize, Serialize};
use ulid::Ulid;
use super::channel::ChannelType;
macro_rules! with_permissions {
($user: expr, $target: expr) => {{
let permissions = PermissionCalculator::new($user.clone())
.guild($target.clone())
.as_permission();
if !permissions.get_access() {
return None;
}
permissions
}};
}
/// fetch your guilds
#[get("/@me")]
@@ -46,10 +56,8 @@ pub fn my_guilds(user: UserRef) -> Response {
/// fetch a guild
#[get("/<target>")]
pub fn guild(user: UserRef, target: Guild) -> Option<Response> {
if find_member_permissions(user.id.clone(), target.id.clone(), None) == 0 {
return None;
}
pub fn guild(user: UserRef, target: GuildRef) -> Option<Response> {
with_permissions!(user, target);
let mut targets = vec![];
for channel in target.channels {