Add edit message route.

This commit is contained in:
Paul Makles
2021-01-18 20:54:08 +00:00
parent ba08746e92
commit accd6d7789
9 changed files with 90 additions and 5 deletions

View File

@@ -0,0 +1,58 @@
use crate::database::*;
use crate::util::result::{Error, Result};
use chrono::Utc;
use mongodb::bson::{Bson, DateTime, doc};
use rocket_contrib::json::Json;
use serde::{Deserialize, Serialize};
use validator::Validate;
#[derive(Validate, Serialize, Deserialize)]
pub struct Data {
#[validate(length(min = 1, max = 2000))]
content: String,
}
#[patch("/<target>/messages/<msg>", data = "<edit>")]
pub async fn req(user: User, target: Ref, msg: Ref, edit: Json<Data>) -> Result<()> {
edit.validate()
.map_err(|error| Error::FailedValidation { error })?;
let channel = target.fetch_channel().await?;
let perm = permissions::channel::calculate(&user, &channel).await;
if !perm.get_view() {
Err(Error::LabelMe)?
}
let mut message = msg.fetch_message().await?;
if message.author != user.id {
Err(Error::CannotEditMessage)?
}
let edited = Utc::now();
get_collection("messages")
.update_one(
doc! {
"_id": &message.id
},
doc! {
"$set": {
"content": &edit.content,
"edited": Bson::DateTime(edited)
}
},
None,
)
.await
.map_err(|_| Error::DatabaseError {
operation: "update_one",
with: "message",
})?;
message.content = edit.content.clone();
message.edited = Some(DateTime(edited));
message.publish_edit().await?;
Ok(())
}

View File

@@ -2,6 +2,7 @@ use rocket::Route;
mod delete_channel;
mod fetch_channel;
mod message_edit;
mod message_fetch;
mod message_query;
mod message_send;
@@ -12,6 +13,7 @@ pub fn routes() -> Vec<Route> {
delete_channel::req,
message_send::req,
message_query::req,
message_fetch::req
message_fetch::req,
message_edit::req
]
}