use revolt_quark::{ models::{ message::DataMessageSend, Message, User, }, perms, web::idempotency::IdempotencyKey, Db, Error, Permission, Ref, Result, types::push::MessageAuthor, }; use rocket::serde::json::Json; use validator::Validate; /// # Send Message /// /// Sends a message to the given channel. #[openapi(tag = "Messaging")] #[post("//messages", data = "")] pub async fn message_send( db: &Db, user: User, target: Ref, data: Json, idempotency: IdempotencyKey, ) -> Result> { let data = data.into_inner(); data.validate() .map_err(|error| Error::FailedValidation { error })?; // Ensure we have permissions to send a message let channel = target.as_channel(db).await?; let mut permissions = perms(&user).channel(&channel); permissions .throw_permission_and_view_channel(db, Permission::SendMessage) .await?; // Verify permissions for masquerade. if let Some(masq) = &data.masquerade { permissions .throw_permission(db, Permission::Masquerade) .await?; if masq.colour.is_some() { permissions .throw_permission(db, Permission::ManageRole) .await?; } } // Create the message let message = channel.send_message(db, data, MessageAuthor::User(&user), idempotency).await?; Ok(Json(message)) }