use revolt_config::config; use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, Database, Role, User, }; use revolt_models::v0; use revolt_permissions::{calculate_server_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; /// Create Role /// /// Creates a new server role. #[utoipa::path( tag = "Server Permissions", security(("Session-Token" = []), ("Bot-Token" = [])), responses( (status = 200, body = v0::NewRoleResponse), ), )] #[post("//roles", data = "")] pub async fn create( db: &State, user: User, target: Reference<'_>, data: Json, ) -> Result> { let data = data.into_inner(); data.validate().map_err(|error| { create_error!(FailedValidation { error: error.to_string() }) })?; let server = target.as_server(db).await?; let mut query = DatabasePermissionQuery::new(db, &user).server(&server); calculate_server_permissions(&mut query) .await .throw_if_lacking_channel_permission(ChannelPermission::ManageRole)?; let config = config().await; if server.roles.len() >= config.features.limits.global.server_roles { return Err(create_error!(TooManyRoles { max: config.features.limits.global.server_roles, })); }; let role = Role { name: data.name, // Rank of the new role should be below the lowest role rank: server.roles.len() as i64, colour: None, hoist: false, permissions: Default::default(), }; Ok(Json(v0::NewRoleResponse { id: role.create(db, &server.id).await?, role: role.into(), })) }