diff --git a/src/routes/servers/invites_fetch.rs b/src/routes/servers/invites_fetch.rs new file mode 100644 index 00000000..f55dce7e --- /dev/null +++ b/src/routes/servers/invites_fetch.rs @@ -0,0 +1,53 @@ +use crate::database::*; +use crate::util::result::{Error, Result}; + +use rocket_contrib::json::JsonValue; +use serde::{Serialize, Deserialize}; +use mongodb::bson::{doc, from_document}; +use futures::StreamExt; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ServerInvite { + #[serde(rename = "_id")] + code: String, + creator: String, + channel: String, +} + +#[get("//invites")] +pub async fn req(user: User, target: Ref) -> Result { + let target = target.fetch_server().await?; + + let perm = permissions::PermissionCalculator::new(&user) + .with_server(&target) + .for_server() + .await?; + + if !perm.get_manage_server() { + Err(Error::MissingPermission)? + } + + let mut cursor = get_collection("invites") + .find( + doc! { + "server": target.id + }, + None, + ) + .await + .map_err(|_| Error::DatabaseError { + operation: "find", + with: "invites", + })?; + + let mut invites = vec![]; + while let Some(result) = cursor.next().await { + if let Ok(doc) = result { + if let Ok(invite) = from_document::(doc) { + invites.push(invite); + } + } + } + + Ok(json!(invites)) +} diff --git a/src/routes/servers/mod.rs b/src/routes/servers/mod.rs index b668399d..bfc704f1 100644 --- a/src/routes/servers/mod.rs +++ b/src/routes/servers/mod.rs @@ -9,6 +9,8 @@ mod channel_create; mod members_fetch; +mod invites_fetch; + pub fn routes() -> Vec { routes![ server_create::req, @@ -16,6 +18,7 @@ pub fn routes() -> Vec { server_fetch::req, server_edit::req, channel_create::req, - members_fetch::req + members_fetch::req, + invites_fetch::req ] }