forked from jmug/stoatchat
feat: implement channel invites, perms, group create, members fetch
chore: when you accidentally run fmt
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
use revolt_quark::{EmptyResponse, Result};
|
||||
|
||||
#[put("/<target>/ack/<message>")]
|
||||
pub async fn req(/*user: UserRef, target: Ref, message: Ref*/ target: String, message: String) -> Result<EmptyResponse> {
|
||||
pub async fn req(
|
||||
/*user: UserRef, target: Ref, message: Ref*/ target: String,
|
||||
message: String,
|
||||
) -> Result<EmptyResponse> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
use revolt_quark::{Error, EmptyResponse, Result, models::{User, Channel, channel::PartialChannel}, Ref, Db, perms, ChannelPermission};
|
||||
use revolt_quark::{
|
||||
models::{channel::PartialChannel, Channel, User},
|
||||
perms, ChannelPermission, Db, EmptyResponse, Error, Ref, Result,
|
||||
};
|
||||
|
||||
use mongodb::bson::doc;
|
||||
|
||||
@@ -8,16 +11,21 @@ pub async fn req(db: &Db, user: User, target: Ref) -> Result<EmptyResponse> {
|
||||
let perm = perms(&user).channel(&channel).calc_channel(db).await;
|
||||
|
||||
if !perm.get_view() {
|
||||
return Err(Error::NotFound)
|
||||
return Err(Error::NotFound);
|
||||
}
|
||||
|
||||
match channel {
|
||||
Channel::SavedMessages { .. } => Err(Error::NoEffect),
|
||||
Channel::DirectMessage { id, .. } => {
|
||||
db.update_channel(&id, &PartialChannel {
|
||||
active: Some(false),
|
||||
..Default::default()
|
||||
}, vec![]).await?;
|
||||
db.update_channel(
|
||||
&id,
|
||||
&PartialChannel {
|
||||
active: Some(false),
|
||||
..Default::default()
|
||||
},
|
||||
vec![],
|
||||
)
|
||||
.await?;
|
||||
|
||||
Ok(EmptyResponse)
|
||||
}
|
||||
@@ -29,10 +37,15 @@ pub async fn req(db: &Db, user: User, target: Ref) -> Result<EmptyResponse> {
|
||||
} => {
|
||||
if user.id == owner {
|
||||
if let Some(new_owner) = recipients.iter().find(|x| *x != &user.id) {
|
||||
db.update_channel(&id, &PartialChannel {
|
||||
owner: Some(new_owner.into()),
|
||||
..Default::default()
|
||||
}, vec![]).await?;
|
||||
db.update_channel(
|
||||
&id,
|
||||
&PartialChannel {
|
||||
owner: Some(new_owner.into()),
|
||||
..Default::default()
|
||||
},
|
||||
vec![],
|
||||
)
|
||||
.await?;
|
||||
} else {
|
||||
db.delete_channel(&id).await?;
|
||||
return Ok(EmptyResponse);
|
||||
@@ -54,13 +67,14 @@ pub async fn req(db: &Db, user: User, target: Ref) -> Result<EmptyResponse> {
|
||||
|
||||
Ok(EmptyResponse)
|
||||
}
|
||||
Channel::TextChannel { id, .. } |
|
||||
Channel::VoiceChannel { id, .. } => {
|
||||
Channel::TextChannel { id, .. } | Channel::VoiceChannel { id, .. } => {
|
||||
if perm.get_manage_channel() {
|
||||
db.delete_channel(&id).await?;
|
||||
Ok(EmptyResponse)
|
||||
} else {
|
||||
Err(Error::MissingPermission { permission: ChannelPermission::ManageChannel as i32 })
|
||||
Err(Error::MissingPermission {
|
||||
permission: ChannelPermission::ManageChannel as i32,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
use revolt_quark::{Error, Result, models::{channel::{FieldsChannel, PartialChannel, Channel}, User, File}, Ref, Database, perms, ChannelPermission};
|
||||
use revolt_quark::{
|
||||
models::{
|
||||
channel::{Channel, FieldsChannel, PartialChannel},
|
||||
File, User,
|
||||
},
|
||||
perms, ChannelPermission, Database, Error, Ref, Result,
|
||||
};
|
||||
|
||||
use mongodb::bson::doc;
|
||||
use rocket::{serde::json::Json, State};
|
||||
@@ -22,24 +28,63 @@ pub struct Data {
|
||||
}
|
||||
|
||||
#[patch("/<target>", data = "<data>")]
|
||||
pub async fn req(db: &State<Database>, user: User, target: Ref, data: Json<Data>) -> Result<Json<Channel>> {
|
||||
pub async fn req(
|
||||
db: &State<Database>,
|
||||
user: User,
|
||||
target: Ref,
|
||||
data: Json<Data>,
|
||||
) -> Result<Json<Channel>> {
|
||||
let data = data.into_inner();
|
||||
data.validate().map_err(|error| Error::FailedValidation { error })?;
|
||||
data.validate()
|
||||
.map_err(|error| Error::FailedValidation { error })?;
|
||||
|
||||
let mut channel = target.as_channel(db).await?;
|
||||
if !perms(&user).channel(&channel).calc_channel(db).await.get_manage_channel() {
|
||||
return Err(Error::MissingPermission { permission: ChannelPermission::ManageChannel as i32 })
|
||||
if !perms(&user)
|
||||
.channel(&channel)
|
||||
.calc_channel(db)
|
||||
.await
|
||||
.get_manage_channel()
|
||||
{
|
||||
return Err(Error::MissingPermission {
|
||||
permission: ChannelPermission::ManageChannel as i32,
|
||||
});
|
||||
}
|
||||
|
||||
if data.name.is_none() && data.description.is_none() && data.icon.is_none() && data.nsfw.is_none() && data.remove.is_none() {
|
||||
return Ok(Json(channel))
|
||||
if data.name.is_none()
|
||||
&& data.description.is_none()
|
||||
&& data.icon.is_none()
|
||||
&& data.nsfw.is_none()
|
||||
&& data.remove.is_none()
|
||||
{
|
||||
return Ok(Json(channel));
|
||||
}
|
||||
|
||||
let mut partial: PartialChannel = Default::default();
|
||||
match &mut channel {
|
||||
Channel::Group { id, name, description, icon, nsfw, .. }
|
||||
| Channel::TextChannel { id, name, description, icon, nsfw, .. }
|
||||
| Channel::VoiceChannel { id, name, description, icon, nsfw, .. } => {
|
||||
Channel::Group {
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
icon,
|
||||
nsfw,
|
||||
..
|
||||
}
|
||||
| Channel::TextChannel {
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
icon,
|
||||
nsfw,
|
||||
..
|
||||
}
|
||||
| Channel::VoiceChannel {
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
icon,
|
||||
nsfw,
|
||||
..
|
||||
} => {
|
||||
if let Some(fields) = &data.remove {
|
||||
if fields.contains(&FieldsChannel::Icon) {
|
||||
if let Some(icon) = &icon {
|
||||
@@ -51,10 +96,10 @@ pub async fn req(db: &State<Database>, user: User, target: Ref, data: Json<Data>
|
||||
match field {
|
||||
FieldsChannel::Description => {
|
||||
description.take();
|
||||
},
|
||||
}
|
||||
FieldsChannel::Icon => {
|
||||
icon.take();
|
||||
},
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@@ -80,9 +125,10 @@ pub async fn req(db: &State<Database>, user: User, target: Ref, data: Json<Data>
|
||||
partial.nsfw = Some(new_nsfw);
|
||||
}
|
||||
|
||||
db.update_channel(id, &partial, data.remove.unwrap_or_default()).await?;
|
||||
},
|
||||
_ => return Err(Error::InvalidOperation)
|
||||
db.update_channel(id, &partial, data.remove.unwrap_or_default())
|
||||
.await?;
|
||||
}
|
||||
_ => return Err(Error::InvalidOperation),
|
||||
};
|
||||
|
||||
Ok(Json(channel))
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
use revolt_quark::{Error, Result, models::{User, Channel}, Ref, Database, perms, ChannelPermission};
|
||||
use revolt_quark::{
|
||||
models::{Channel, User},
|
||||
perms, ChannelPermission, Database, Error, Ref, Result,
|
||||
};
|
||||
|
||||
use rocket::{serde::json::Json, State};
|
||||
|
||||
@@ -6,9 +9,16 @@ use rocket::{serde::json::Json, State};
|
||||
pub async fn req(db: &State<Database>, user: User, target: Ref) -> Result<Json<Channel>> {
|
||||
let target = target.as_channel(db).await?;
|
||||
|
||||
if perms(&user).channel(&target).calc_channel(db).await.get_view() {
|
||||
if perms(&user)
|
||||
.channel(&target)
|
||||
.calc_channel(db)
|
||||
.await
|
||||
.get_view()
|
||||
{
|
||||
Ok(Json(target))
|
||||
} else {
|
||||
Err(Error::MissingPermission { permission: ChannelPermission::View as i32 })
|
||||
Err(Error::MissingPermission {
|
||||
permission: ChannelPermission::View as i32,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@ use revolt_quark::{EmptyResponse, Result};
|
||||
use mongodb::bson::doc;
|
||||
|
||||
#[put("/<target>/recipients/<member>")]
|
||||
pub async fn req(/*user: UserRef, target: Ref, member: Ref*/ target: String, member: String) -> Result<EmptyResponse> {
|
||||
pub async fn req(
|
||||
/*user: UserRef, target: Ref, member: Ref*/ target: String,
|
||||
member: String,
|
||||
) -> Result<EmptyResponse> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
use revolt_quark::Result;
|
||||
use std::{collections::HashSet, iter::FromIterator};
|
||||
|
||||
use revolt_quark::{
|
||||
get_relationship,
|
||||
models::{user::RelationshipStatus, Channel, User},
|
||||
Db, Error, Result,
|
||||
};
|
||||
|
||||
use mongodb::bson::doc;
|
||||
use rocket::serde::json::{Json, Value};
|
||||
use rocket::serde::json::Json;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use ulid::Ulid;
|
||||
use validator::Validate;
|
||||
|
||||
#[derive(Validate, Serialize, Deserialize)]
|
||||
@@ -13,10 +20,48 @@ pub struct Data {
|
||||
description: Option<String>,
|
||||
users: Vec<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
nsfw: Option<bool>
|
||||
nsfw: Option<bool>,
|
||||
}
|
||||
|
||||
#[post("/create", data = "<info>")]
|
||||
pub async fn req(/*_idempotency: IdempotencyKey, user: User,*/ info: Json<Data>) -> Result<Value> {
|
||||
todo!();
|
||||
pub async fn req(db: &Db, user: User, info: Json<Data>) -> Result<Json<Channel>> {
|
||||
let info = info.into_inner();
|
||||
info.validate()
|
||||
.map_err(|error| Error::FailedValidation { error })?;
|
||||
|
||||
let mut set: HashSet<String> = HashSet::from_iter(info.users.into_iter());
|
||||
set.insert(user.id.clone());
|
||||
|
||||
// ! FIXME: un hard code this
|
||||
if set.len() > 50 {
|
||||
return Err(Error::GroupTooLarge { max: 50 });
|
||||
}
|
||||
|
||||
for target in &set {
|
||||
match get_relationship(&user, target) {
|
||||
RelationshipStatus::Friend | RelationshipStatus::User => {}
|
||||
_ => {
|
||||
return Err(Error::NotFriends);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let group = Channel::Group {
|
||||
id: Ulid::new().to_string(),
|
||||
|
||||
name: info.name,
|
||||
owner: user.id,
|
||||
description: info.description,
|
||||
recipients: set.into_iter().collect::<Vec<String>>(),
|
||||
|
||||
icon: None,
|
||||
last_message_id: None,
|
||||
|
||||
permissions: None,
|
||||
|
||||
nsfw: info.nsfw.unwrap_or(false),
|
||||
};
|
||||
|
||||
db.insert_channel(&group).await?;
|
||||
Ok(Json(group))
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@ use revolt_quark::{EmptyResponse, Result};
|
||||
use mongodb::bson::doc;
|
||||
|
||||
#[delete("/<target>/recipients/<member>")]
|
||||
pub async fn req(/*user: UserRef, target: Ref, member: Ref*/ target: String, member: String) -> Result<EmptyResponse> {
|
||||
pub async fn req(
|
||||
/*user: UserRef, target: Ref, member: Ref*/ target: String,
|
||||
member: String,
|
||||
) -> Result<EmptyResponse> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
@@ -1,17 +1,25 @@
|
||||
use revolt_quark::Result;
|
||||
use revolt_quark::{
|
||||
models::{Invite, User},
|
||||
perms, ChannelPermission, Db, Error, Ref, Result,
|
||||
};
|
||||
|
||||
use mongodb::bson::doc;
|
||||
use rocket::serde::json::Value;
|
||||
|
||||
lazy_static! {
|
||||
static ref ALPHABET: [char; 54] = [
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
|
||||
'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
|
||||
'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'
|
||||
];
|
||||
}
|
||||
use rocket::serde::json::Json;
|
||||
|
||||
#[post("/<target>/invites")]
|
||||
pub async fn req(/*user: UserRef, target: Ref*/ target: String) -> Result<Value> {
|
||||
todo!()
|
||||
pub async fn req(db: &Db, user: User, target: Ref) -> Result<Json<Invite>> {
|
||||
let channel = target.as_channel(db).await?;
|
||||
|
||||
if !perms(&user)
|
||||
.channel(&channel)
|
||||
.calc_channel(db)
|
||||
.await
|
||||
.get_invite_others()
|
||||
{
|
||||
return Err(Error::MissingPermission {
|
||||
permission: ChannelPermission::InviteOthers as i32,
|
||||
});
|
||||
}
|
||||
|
||||
Invite::create(db, &user, &channel).await.map(Json)
|
||||
}
|
||||
|
||||
@@ -1,8 +1,31 @@
|
||||
use revolt_quark::Result;
|
||||
use revolt_quark::{
|
||||
models::{Channel, User},
|
||||
perms, Db, Error, Ref, Result,
|
||||
};
|
||||
|
||||
use rocket::serde::json::Value;
|
||||
use rocket::serde::json::Json;
|
||||
|
||||
#[get("/<target>/members")]
|
||||
pub async fn req(/*user: UserRef, target: Ref*/ target: String) -> Result<Value> {
|
||||
todo!()
|
||||
pub async fn req(db: &Db, user: User, target: Ref) -> Result<Json<Vec<User>>> {
|
||||
let channel = target.as_channel(db).await?;
|
||||
if !perms(&user)
|
||||
.channel(&channel)
|
||||
.calc_channel(db)
|
||||
.await
|
||||
.get_view()
|
||||
{
|
||||
return Err(Error::NotFound);
|
||||
}
|
||||
|
||||
if let Channel::Group { recipients, .. } = channel {
|
||||
Ok(Json(
|
||||
db.fetch_users(&recipients)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|x| x.with_relationship(&user))
|
||||
.collect::<Vec<User>>(),
|
||||
))
|
||||
} else {
|
||||
Err(Error::InvalidOperation)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@ use revolt_quark::{EmptyResponse, Result};
|
||||
use mongodb::bson::doc;
|
||||
|
||||
#[delete("/<target>/messages/<msg>")]
|
||||
pub async fn req(/*user: UserRef, target: Ref, msg: Ref*/ target: String, msg: String) -> Result<EmptyResponse> {
|
||||
pub async fn req(
|
||||
/*user: UserRef, target: Ref, msg: Ref*/ target: String,
|
||||
msg: String,
|
||||
) -> Result<EmptyResponse> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use revolt_quark::{EmptyResponse, Result};
|
||||
|
||||
use chrono::Utc;
|
||||
use mongodb::bson::{Bson, Document, doc, to_document};
|
||||
use mongodb::bson::{doc, to_document, Bson, Document};
|
||||
use rocket::serde::json::Json;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use validator::Validate;
|
||||
@@ -15,6 +15,10 @@ pub struct Data {
|
||||
}
|
||||
|
||||
#[patch("/<target>/messages/<msg>", data = "<edit>")]
|
||||
pub async fn req(/*user: UserRef, target: Ref, msg: Ref,*/ target: String, msg: String, edit: Json<Data>) -> Result<EmptyResponse> {
|
||||
pub async fn req(
|
||||
/*user: UserRef, target: Ref, msg: Ref,*/ target: String,
|
||||
msg: String,
|
||||
edit: Json<Data>,
|
||||
) -> Result<EmptyResponse> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@ use revolt_quark::Result;
|
||||
use rocket::serde::json::Value;
|
||||
|
||||
#[get("/<target>/messages/<msg>")]
|
||||
pub async fn req(/*user: UserRef, target: Ref, msg: Ref*/ target: String, msg: String) -> Result<Value> {
|
||||
pub async fn req(
|
||||
/*user: UserRef, target: Ref, msg: Ref*/ target: String,
|
||||
msg: String,
|
||||
) -> Result<Value> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ use std::collections::HashSet;
|
||||
|
||||
use revolt_quark::{Error, Result};
|
||||
|
||||
use futures::{StreamExt, try_join};
|
||||
use futures::{try_join, StreamExt};
|
||||
use mongodb::{
|
||||
bson::{doc, from_document},
|
||||
options::FindOptions,
|
||||
@@ -35,6 +35,9 @@ pub struct Options {
|
||||
}
|
||||
|
||||
#[get("/<target>/messages?<options..>")]
|
||||
pub async fn req(/*user: UserRef, target: Ref,*/ target: String, options: Options) -> Result<Value> {
|
||||
pub async fn req(
|
||||
/*user: UserRef, target: Ref,*/ target: String,
|
||||
options: Options,
|
||||
) -> Result<Value> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
@@ -11,6 +11,9 @@ pub struct Options {
|
||||
}
|
||||
|
||||
#[post("/<target>/messages/stale", data = "<data>")]
|
||||
pub async fn req(/*user: UserRef, target: Ref,*/ target: String, data: Json<Options>) -> Result<Value> {
|
||||
pub async fn req(
|
||||
/*user: UserRef, target: Ref,*/ target: String,
|
||||
data: Json<Options>,
|
||||
) -> Result<Value> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
@@ -39,6 +39,9 @@ pub struct Options {
|
||||
}
|
||||
|
||||
#[post("/<target>/search", data = "<options>")]
|
||||
pub async fn req(/*user: UserRef, target: Ref,*/ target: String, options: Json<Options>) -> Result<Value> {
|
||||
pub async fn req(
|
||||
/*user: UserRef, target: Ref,*/ target: String,
|
||||
options: Json<Options>,
|
||||
) -> Result<Value> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use revolt_quark::{Result, models::message::Masquerade};
|
||||
use revolt_quark::{models::message::Masquerade, Result};
|
||||
|
||||
use mongodb::bson::doc;
|
||||
use regex::Regex;
|
||||
@@ -9,7 +9,7 @@ use validator::Validate;
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct Reply {
|
||||
id: String,
|
||||
mention: bool
|
||||
mention: bool,
|
||||
}
|
||||
|
||||
#[derive(Validate, Serialize, Deserialize, Clone, Debug)]
|
||||
@@ -21,7 +21,7 @@ pub struct SendableEmbed {
|
||||
#[validate(length(min = 1, max = 2000))]
|
||||
description: Option<String>,
|
||||
media: Option<String>,
|
||||
colour: Option<String>,
|
||||
colour: Option<String>,
|
||||
}
|
||||
#[derive(Validate, Serialize, Deserialize)]
|
||||
pub struct Data {
|
||||
@@ -34,7 +34,7 @@ pub struct Data {
|
||||
//#[validate]
|
||||
masquerade: Option<Masquerade>,
|
||||
#[validate(length(min = 1, max = 10))]
|
||||
embeds: Option<Vec<SendableEmbed>>
|
||||
embeds: Option<Vec<SendableEmbed>>,
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
@@ -43,6 +43,10 @@ lazy_static! {
|
||||
}
|
||||
|
||||
#[post("/<target>/messages", data = "<message>")]
|
||||
pub async fn message_send(/*user: UserRef, _r: Ratelimiter, mut idempotency: IdempotencyKey, target: Ref,*/ target: String, message: Json<Data>) -> /*Result<RatelimitResponse<Value>>*/ Result<Value> {
|
||||
pub async fn message_send(
|
||||
/*user: UserRef, _r: Ratelimiter, mut idempotency: IdempotencyKey, target: Ref,*/
|
||||
target: String,
|
||||
message: Json<Data>,
|
||||
) -> Result<Value> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
@@ -4,21 +4,21 @@ mod channel_ack;
|
||||
mod channel_delete;
|
||||
mod channel_edit;
|
||||
mod channel_fetch;
|
||||
mod members_fetch;
|
||||
mod group_add_member;
|
||||
mod group_create;
|
||||
mod group_remove_member;
|
||||
mod invite_create;
|
||||
mod voice_join;
|
||||
mod members_fetch;
|
||||
mod message_delete;
|
||||
mod message_edit;
|
||||
mod message_fetch;
|
||||
mod message_query;
|
||||
mod message_search;
|
||||
mod message_query_stale;
|
||||
mod message_search;
|
||||
mod message_send;
|
||||
mod permissions_set;
|
||||
mod permissions_set_default;
|
||||
mod voice_join;
|
||||
|
||||
pub fn routes() -> Vec<Route> {
|
||||
routes![
|
||||
|
||||
@@ -1,16 +1,44 @@
|
||||
use mongodb::bson::doc;
|
||||
use rocket::serde::json::Json;
|
||||
use serde::{Serialize, Deserialize};
|
||||
use validator::Contains;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use revolt_quark::{EmptyResponse, Result};
|
||||
use revolt_quark::{
|
||||
models::{Channel, User},
|
||||
perms, ChannelPermission, Db, EmptyResponse, Error, Ref, Result,
|
||||
};
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct Data {
|
||||
permissions: u32
|
||||
permissions: u32,
|
||||
}
|
||||
|
||||
#[put("/<target>/permissions/<role>", data = "<data>", rank = 2)]
|
||||
pub async fn req(/*user: UserRef, target: Ref,*/ target: String, role: String, data: Json<Data>) -> Result<EmptyResponse> {
|
||||
todo!()
|
||||
pub async fn req(
|
||||
db: &Db,
|
||||
user: User,
|
||||
target: Ref,
|
||||
role: String,
|
||||
data: Json<Data>,
|
||||
) -> Result<EmptyResponse> {
|
||||
let channel = target.as_channel(db).await?;
|
||||
if !perms(&user)
|
||||
.channel(&channel)
|
||||
.calc_channel(db)
|
||||
.await
|
||||
.get_manage_channel()
|
||||
{
|
||||
return Err(Error::MissingPermission {
|
||||
permission: ChannelPermission::ManageChannel as i32,
|
||||
});
|
||||
}
|
||||
|
||||
match channel {
|
||||
Channel::TextChannel { id, .. } | Channel::VoiceChannel { id, .. } => {
|
||||
db.set_channel_role_permission(&id, &role, data.permissions)
|
||||
.await?;
|
||||
}
|
||||
_ => return Err(Error::InvalidOperation),
|
||||
}
|
||||
|
||||
Ok(EmptyResponse)
|
||||
}
|
||||
|
||||
@@ -1,15 +1,56 @@
|
||||
use mongodb::bson::doc;
|
||||
use rocket::serde::json::Json;
|
||||
use serde::{Serialize, Deserialize};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use revolt_quark::{EmptyResponse, Result};
|
||||
use revolt_quark::{
|
||||
models::{channel::PartialChannel, Channel, User},
|
||||
perms, ChannelPermission, Db, EmptyResponse, Error, Ref, Result,
|
||||
};
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct Data {
|
||||
permissions: u32
|
||||
permissions: u32,
|
||||
}
|
||||
|
||||
#[put("/<target>/permissions/default", data = "<data>", rank = 1)]
|
||||
pub async fn req(/*user: UserRef, target: Ref,*/ target: String, data: Json<Data>) -> Result<EmptyResponse> {
|
||||
todo!()
|
||||
pub async fn req(db: &Db, user: User, target: Ref, data: Json<Data>) -> Result<EmptyResponse> {
|
||||
let channel = target.as_channel(db).await?;
|
||||
if !perms(&user)
|
||||
.channel(&channel)
|
||||
.calc_channel(db)
|
||||
.await
|
||||
.get_manage_channel()
|
||||
{
|
||||
return Err(Error::MissingPermission {
|
||||
permission: ChannelPermission::ManageChannel as i32,
|
||||
});
|
||||
}
|
||||
|
||||
match channel {
|
||||
Channel::Group { id, .. } => {
|
||||
db.update_channel(
|
||||
&id,
|
||||
&PartialChannel {
|
||||
permissions: Some(data.permissions as i32),
|
||||
..Default::default()
|
||||
},
|
||||
vec![],
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
Channel::TextChannel { id, .. } | Channel::VoiceChannel { id, .. } => {
|
||||
db.update_channel(
|
||||
&id,
|
||||
&PartialChannel {
|
||||
default_permissions: Some(data.permissions as i32),
|
||||
..Default::default()
|
||||
},
|
||||
vec![],
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
_ => return Err(Error::InvalidOperation),
|
||||
}
|
||||
|
||||
Ok(EmptyResponse)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user