Skip to content
Snippets Groups Projects
Verified Commit e92b6864 authored by insert's avatar insert
Browse files

Switch guild to new permission system.

parent 28fa2aad
No related merge requests found
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,
......
......@@ -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(),
......
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 {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment