From ba08746e921db26be8bb54375c25d22759f4efc5 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Mon, 18 Jan 2021 20:30:55 +0000 Subject: [PATCH] Rename fetch to query, add fetch by id. --- src/database/guards/reference.rs | 4 ++ src/routes/channels/message_fetch.rs | 71 +++----------------------- src/routes/channels/message_query.rs | 76 ++++++++++++++++++++++++++++ src/routes/channels/mod.rs | 2 + 4 files changed, 88 insertions(+), 65 deletions(-) create mode 100644 src/routes/channels/message_query.rs diff --git a/src/database/guards/reference.rs b/src/database/guards/reference.rs index a90a2935..a1262c33 100644 --- a/src/database/guards/reference.rs +++ b/src/database/guards/reference.rs @@ -46,6 +46,10 @@ impl Ref { pub async fn fetch_channel(&self) -> Result { self.fetch("channels").await } + + pub async fn fetch_message(&self) -> Result { + self.fetch("messages").await + } } impl User { diff --git a/src/routes/channels/message_fetch.rs b/src/routes/channels/message_fetch.rs index 0bb12848..887a68a2 100644 --- a/src/routes/channels/message_fetch.rs +++ b/src/routes/channels/message_fetch.rs @@ -1,76 +1,17 @@ use crate::database::*; use crate::util::result::{Error, Result}; -use futures::StreamExt; -use mongodb::{ - bson::{doc, from_document}, - options::FindOptions, -}; -use rocket::request::Form; use rocket_contrib::json::JsonValue; -use serde::{Deserialize, Serialize}; -use validator::Validate; -#[derive(Validate, Serialize, Deserialize, FromForm)] -pub struct Options { - #[validate(range(min = 1, max = 100))] - limit: Option, - #[validate(length(min = 26, max = 26))] - before: Option, - #[validate(length(min = 26, max = 26))] - after: Option, -} +#[get("//messages/")] +pub async fn req(user: User, target: Ref, msg: Ref) -> Result { + let channel = target.fetch_channel().await?; -#[get("//messages?")] -pub async fn req(user: User, target: Ref, options: Form) -> Result { - options - .validate() - .map_err(|error| Error::FailedValidation { error })?; - - let target = target.fetch_channel().await?; - - let perm = permissions::channel::calculate(&user, &target).await; + let perm = permissions::channel::calculate(&user, &channel).await; if !perm.get_view() { Err(Error::LabelMe)? } - let mut query = doc! { "channel": target.id() }; - - if let Some(before) = &options.before { - query.insert("_id", doc! { "$lt": before }); - } - - if let Some(after) = &options.after { - query.insert("_id", doc! { "$gt": after }); - } - - let mut cursor = get_collection("messages") - .find( - query, - FindOptions::builder() - .limit(options.limit.unwrap_or(50)) - .sort(doc! { - "_id": -1 - }) - .build(), - ) - .await - .map_err(|_| Error::DatabaseError { - operation: "find", - with: "messages", - })?; - - let mut messages = vec![]; - while let Some(result) = cursor.next().await { - if let Ok(doc) = result { - messages.push( - from_document::(doc).map_err(|_| Error::DatabaseError { - operation: "from_document", - with: "message", - })?, - ); - } - } - - Ok(json!(messages)) + let message = msg.fetch_message().await?; + Ok(json!(message)) } diff --git a/src/routes/channels/message_query.rs b/src/routes/channels/message_query.rs new file mode 100644 index 00000000..0bb12848 --- /dev/null +++ b/src/routes/channels/message_query.rs @@ -0,0 +1,76 @@ +use crate::database::*; +use crate::util::result::{Error, Result}; + +use futures::StreamExt; +use mongodb::{ + bson::{doc, from_document}, + options::FindOptions, +}; +use rocket::request::Form; +use rocket_contrib::json::JsonValue; +use serde::{Deserialize, Serialize}; +use validator::Validate; + +#[derive(Validate, Serialize, Deserialize, FromForm)] +pub struct Options { + #[validate(range(min = 1, max = 100))] + limit: Option, + #[validate(length(min = 26, max = 26))] + before: Option, + #[validate(length(min = 26, max = 26))] + after: Option, +} + +#[get("//messages?")] +pub async fn req(user: User, target: Ref, options: Form) -> Result { + options + .validate() + .map_err(|error| Error::FailedValidation { error })?; + + let target = target.fetch_channel().await?; + + let perm = permissions::channel::calculate(&user, &target).await; + if !perm.get_view() { + Err(Error::LabelMe)? + } + + let mut query = doc! { "channel": target.id() }; + + if let Some(before) = &options.before { + query.insert("_id", doc! { "$lt": before }); + } + + if let Some(after) = &options.after { + query.insert("_id", doc! { "$gt": after }); + } + + let mut cursor = get_collection("messages") + .find( + query, + FindOptions::builder() + .limit(options.limit.unwrap_or(50)) + .sort(doc! { + "_id": -1 + }) + .build(), + ) + .await + .map_err(|_| Error::DatabaseError { + operation: "find", + with: "messages", + })?; + + let mut messages = vec![]; + while let Some(result) = cursor.next().await { + if let Ok(doc) = result { + messages.push( + from_document::(doc).map_err(|_| Error::DatabaseError { + operation: "from_document", + with: "message", + })?, + ); + } + } + + Ok(json!(messages)) +} diff --git a/src/routes/channels/mod.rs b/src/routes/channels/mod.rs index bceb1155..fbd9e7d0 100644 --- a/src/routes/channels/mod.rs +++ b/src/routes/channels/mod.rs @@ -3,6 +3,7 @@ use rocket::Route; mod delete_channel; mod fetch_channel; mod message_fetch; +mod message_query; mod message_send; pub fn routes() -> Vec { @@ -10,6 +11,7 @@ pub fn routes() -> Vec { fetch_channel::req, delete_channel::req, message_send::req, + message_query::req, message_fetch::req ] }