forked from jmug/stoatchat
Switch guild to new permission system.
This commit is contained in:
@@ -1,48 +1,6 @@
|
|||||||
use bson::doc;
|
use bson::doc;
|
||||||
use serde::{Deserialize, Serialize};
|
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)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct Member {
|
pub struct Member {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
|
|||||||
@@ -11,8 +11,11 @@ use crate::database::guild::Guild;
|
|||||||
pub struct GuildRef {
|
pub struct GuildRef {
|
||||||
#[serde(rename = "_id")]
|
#[serde(rename = "_id")]
|
||||||
pub id: String,
|
pub id: String,
|
||||||
|
pub name: String,
|
||||||
|
pub description: String,
|
||||||
pub owner: String,
|
pub owner: String,
|
||||||
|
|
||||||
|
pub channels: Vec<String>,
|
||||||
pub default_permissions: i32,
|
pub default_permissions: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,7 +25,10 @@ impl GuildRef {
|
|||||||
doc! { "_id": id },
|
doc! { "_id": id },
|
||||||
FindOneOptions::builder()
|
FindOneOptions::builder()
|
||||||
.projection(doc! {
|
.projection(doc! {
|
||||||
|
"name": 1,
|
||||||
|
"description": 1,
|
||||||
"owner": 1,
|
"owner": 1,
|
||||||
|
"channels": 1,
|
||||||
"default_permissions": 1
|
"default_permissions": 1
|
||||||
})
|
})
|
||||||
.build(),
|
.build(),
|
||||||
|
|||||||
@@ -1,17 +1,27 @@
|
|||||||
|
use super::channel::ChannelType;
|
||||||
use super::Response;
|
use super::Response;
|
||||||
use crate::database::{
|
use crate::database::{self, channel::Channel, PermissionCalculator};
|
||||||
self,
|
|
||||||
channel::Channel,
|
|
||||||
guild::{find_member_permissions, Guild},
|
|
||||||
};
|
|
||||||
use crate::guards::auth::UserRef;
|
use crate::guards::auth::UserRef;
|
||||||
|
use crate::guards::guild::GuildRef;
|
||||||
|
|
||||||
use bson::{doc, from_bson, Bson};
|
use bson::{doc, from_bson, Bson};
|
||||||
use rocket_contrib::json::Json;
|
use rocket_contrib::json::Json;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use ulid::Ulid;
|
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
|
/// fetch your guilds
|
||||||
#[get("/@me")]
|
#[get("/@me")]
|
||||||
@@ -46,10 +56,8 @@ pub fn my_guilds(user: UserRef) -> Response {
|
|||||||
|
|
||||||
/// fetch a guild
|
/// fetch a guild
|
||||||
#[get("/<target>")]
|
#[get("/<target>")]
|
||||||
pub fn guild(user: UserRef, target: Guild) -> Option<Response> {
|
pub fn guild(user: UserRef, target: GuildRef) -> Option<Response> {
|
||||||
if find_member_permissions(user.id.clone(), target.id.clone(), None) == 0 {
|
with_permissions!(user, target);
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut targets = vec![];
|
let mut targets = vec![];
|
||||||
for channel in target.channels {
|
for channel in target.channels {
|
||||||
|
|||||||
Reference in New Issue
Block a user