diff --git a/src/database/guild.rs b/src/database/guild.rs index 979b63323b7950a0986eef90d14a400d663439eb..7a4155bf218c10ba6ca551124006a202dc380ac7 100644 --- a/src/database/guild.rs +++ b/src/database/guild.rs @@ -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, diff --git a/src/guards/guild.rs b/src/guards/guild.rs index 268740eed1497305bbea2c7823e7a7cd59ae0737..6e2aeb6069f0eac5a8f5c334d50656d5d2a28b3e 100644 --- a/src/guards/guild.rs +++ b/src/guards/guild.rs @@ -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(), diff --git a/src/routes/guild.rs b/src/routes/guild.rs index 00ca963001af2b94d101da07e3dd1b4b0f2f5794..daadfee13521864d9244b80a76b083210a8f1b08 100644 --- a/src/routes/guild.rs +++ b/src/routes/guild.rs @@ -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 {