use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, Channel, Database, PartialChannel, User, }; use revolt_models::v0::{self, DataDefaultChannelPermissions}; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; /// # Set Default Permission /// /// Sets permissions for the default role in this channel. /// /// Channel must be a `Group`, `TextChannel` or `VoiceChannel`. #[openapi(tag = "Channel Permissions")] #[put("//permissions/default", data = "", rank = 1)] pub async fn set_default_permissions( db: &State, user: User, target: Reference, data: Json, ) -> Result> { let data = data.into_inner(); let mut channel = target.as_channel(db).await?; let mut query = DatabasePermissionQuery::new(db, &user).channel(&channel); let permissions = calculate_channel_permissions(&mut query).await; permissions.throw_if_lacking_channel_permission(ChannelPermission::ManagePermissions)?; match &channel { Channel::Group { .. } => { if let DataDefaultChannelPermissions::Value { permissions } = data { channel .update( db, PartialChannel { permissions: Some(permissions as i64), ..Default::default() }, vec![], ) .await?; } else { return Err(create_error!(InvalidOperation)); } } Channel::TextChannel { default_permissions, .. } | Channel::VoiceChannel { default_permissions, .. } => { if let DataDefaultChannelPermissions::Field { permissions: field } = data { permissions .throw_permission_override(default_permissions.map(|x| x.into()), &field) .await?; channel .update( db, PartialChannel { default_permissions: Some(field.into()), ..Default::default() }, vec![], ) .await?; } else { return Err(create_error!(InvalidOperation)); } } _ => return Err(create_error!(InvalidOperation)), } Ok(Json(channel.into())) }