feat: implement new permissions hierarchy

This commit is contained in:
Paul Makles
2022-02-23 13:30:01 +00:00
parent 71c01e0817
commit 23ec914033
6 changed files with 46 additions and 55 deletions

View File

@@ -3,16 +3,20 @@ use serde::{Deserialize, Serialize};
use revolt_quark::{
models::{channel::PartialChannel, Channel, User},
perms, Db, Error, Permission, Ref, Result,
perms, Db, Error, Override, Permission, Ref, Result,
};
#[derive(Serialize, Deserialize)]
pub struct Data {
permissions: u32,
#[serde(untagged)]
pub enum Data {
Value { permissions: u64 },
Field { permissions: Override },
}
#[put("/<target>/permissions/default", data = "<data>", rank = 1)]
pub async fn req(db: &Db, user: User, target: Ref, data: Json<Data>) -> Result<Json<Channel>> {
let data = data.into_inner();
let mut channel = target.as_channel(db).await?;
perms(&user)
.channel(&channel)
@@ -21,30 +25,38 @@ pub async fn req(db: &Db, user: User, target: Ref, data: Json<Data>) -> Result<J
match &channel {
Channel::Group { .. } => {
channel
.update(
db,
PartialChannel {
permissions: Some(data.permissions as i32),
..Default::default()
},
vec![],
)
.await?;
if let Data::Value { permissions } = data {
channel
.update(
db,
PartialChannel {
permissions: Some(permissions as i64),
..Default::default()
},
vec![],
)
.await?;
} else {
return Err(Error::InvalidOperation);
}
}
Channel::TextChannel { .. } | Channel::VoiceChannel { .. } => {
// ! FIXME_PERMISSIONS
channel
.update(
db,
PartialChannel {
default_permissions: Some(data.permissions as i32),
..Default::default()
},
vec![],
)
.await?;
if let Data::Field { permissions } = data {
channel
.update(
db,
PartialChannel {
default_permissions: Some(permissions.into()),
..Default::default()
},
vec![],
)
.await?;
} else {
return Err(Error::InvalidOperation);
}
}
_ => return Err(Error::InvalidOperation),
}