From f676071641b6df1e8f8548651968bc85b2fa1727 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Thu, 10 Feb 2022 16:55:59 +0000 Subject: [PATCH] feat(sync): implement settings and unreads fetch --- .gitignore | 1 + src/routes/bots/invite.rs | 48 ++++++++++++++++++++------- src/routes/invites/invite_delete.rs | 33 +++++++++++++++++-- src/routes/invites/invite_fetch.rs | 51 ++++++++++++++++++++++++++--- src/routes/sync/get_settings.rs | 9 +++-- src/routes/sync/get_unreads.rs | 8 ++--- src/routes/sync/set_settings.rs | 33 ++++++++++++++----- 7 files changed, 146 insertions(+), 37 deletions(-) diff --git a/.gitignore b/.gitignore index 187298ef..1e079469 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ Rocket.toml /target_backup **/*.rs.bk .mongo +.data .env avatar.png diff --git a/src/routes/bots/invite.rs b/src/routes/bots/invite.rs index 9b8c59ce..ca9ce868 100644 --- a/src/routes/bots/invite.rs +++ b/src/routes/bots/invite.rs @@ -1,4 +1,7 @@ -use revolt_quark::{models::{User, Channel}, EmptyResponse, Error, Ref, Result, Db, perms, ServerPermission, ChannelPermission}; +use revolt_quark::{ + models::{Channel, User}, + perms, ChannelPermission, Db, EmptyResponse, Error, Ref, Result, ServerPermission, +}; use rocket::serde::json::Json; use serde::Deserialize; @@ -11,33 +14,56 @@ pub enum Destination { } #[post("//invite", data = "")] -pub async fn invite_bot(db: &Db, user: User, target: Ref, dest: Json) -> Result { +pub async fn invite_bot( + db: &Db, + user: User, + target: Ref, + dest: Json, +) -> Result { if user.bot.is_some() { return Err(Error::IsBot); } let bot = target.as_bot(db).await?; if !bot.public && bot.owner != user.id { - return Err(Error::BotIsPrivate) + return Err(Error::BotIsPrivate); } match dest.into_inner() { Destination::Server { server } => { let server = db.fetch_server(&server).await?; - if !perms(&user).server(&server).calc_server(db).await.get_manage_server() { - return Err(Error::MissingPermission { permission: ServerPermission::ManageServer as i32 }) + if !perms(&user) + .server(&server) + .calc_server(db) + .await + .get_manage_server() + { + return Err(Error::MissingPermission { + permission: ServerPermission::ManageServer as i32, + }); } - db.insert_member(&server.id, &bot.id).await.map(|_| EmptyResponse) - }, - Destination::Group{ group } => { + db.insert_member(&server.id, &bot.id) + .await + .map(|_| EmptyResponse) + } + Destination::Group { group } => { let channel = db.fetch_channel(&group).await?; - if !perms(&user).channel(&channel).calc_channel(db).await.get_invite_others() { - return Err(Error::MissingPermission { permission: ChannelPermission::InviteOthers as i32 }) + if !perms(&user) + .channel(&channel) + .calc_channel(db) + .await + .get_invite_others() + { + return Err(Error::MissingPermission { + permission: ChannelPermission::InviteOthers as i32, + }); } if let Channel::Group { id, .. } = channel { - db.add_user_to_group(&id, &bot.id).await.map(|_| EmptyResponse) + db.add_user_to_group(&id, &bot.id) + .await + .map(|_| EmptyResponse) } else { Err(Error::InvalidOperation) } diff --git a/src/routes/invites/invite_delete.rs b/src/routes/invites/invite_delete.rs index 0687ee44..283f4971 100644 --- a/src/routes/invites/invite_delete.rs +++ b/src/routes/invites/invite_delete.rs @@ -1,6 +1,33 @@ -use revolt_quark::{EmptyResponse, Result}; +use revolt_quark::{ + models::{Invite, User}, + perms, Db, EmptyResponse, Error, Ref, Result, ServerPermission, +}; #[delete("/")] -pub async fn req(/*user: UserRef, target: Ref*/ target: String) -> Result { - todo!() +pub async fn req(db: &Db, user: User, target: Ref) -> Result { + let invite = target.as_invite(db).await?; + + if user.id == invite.creator() { + db.delete_invite(invite.code()).await + } else { + match invite { + Invite::Server { code, server, .. } => { + let server = db.fetch_server(&server).await?; + if !perms(&user) + .server(&server) + .calc_server(db) + .await + .get_manage_server() + { + return Err(Error::MissingPermission { + permission: ServerPermission::ManageServer as i32, + }); + } + + db.delete_invite(&code).await + } + _ => unreachable!(), + } + } + .map(|_| EmptyResponse) } diff --git a/src/routes/invites/invite_fetch.rs b/src/routes/invites/invite_fetch.rs index 2fc12883..f1f4f2da 100644 --- a/src/routes/invites/invite_fetch.rs +++ b/src/routes/invites/invite_fetch.rs @@ -1,7 +1,7 @@ -use revolt_quark::models::File; -use revolt_quark::Result; +use revolt_quark::models::{Channel, File, Invite}; +use revolt_quark::{Db, Ref, Result}; -use rocket::serde::json::Value; +use rocket::serde::json::Json; use serde::Serialize; #[derive(Serialize, Debug, Clone)] @@ -26,6 +26,47 @@ pub enum InviteResponse { } #[get("/")] -pub async fn req(/*target: Ref*/ target: String) -> Result { - todo!() +pub async fn req(db: &Db, target: Ref) -> Result> { + Ok(Json(match target.as_invite(db).await? { + Invite::Server { + channel, creator, .. + } => { + let channel = db.fetch_channel(&channel).await?; + let user = db.fetch_user(&creator).await?; + + match channel { + Channel::TextChannel { + id, + server, + name, + description, + .. + } + | Channel::VoiceChannel { + id, + server, + name, + description, + .. + } => { + let server = db.fetch_server(&server).await?; + + InviteResponse::Server { + member_count: db.fetch_member_count(&server.id).await? as i64, + server_id: server.id, + server_name: server.name, + server_icon: server.icon, + server_banner: server.banner, + channel_id: id, + channel_name: name, + channel_description: description, + user_name: user.username, + user_avatar: user.avatar, + } + } + _ => unreachable!(), + } + } + _ => unimplemented!(), + })) } diff --git a/src/routes/sync/get_settings.rs b/src/routes/sync/get_settings.rs index e87d1fc5..04e2a223 100644 --- a/src/routes/sync/get_settings.rs +++ b/src/routes/sync/get_settings.rs @@ -1,8 +1,7 @@ -use revolt_quark::{Error, Result}; +use revolt_quark::{Result, models::{UserSettings, User}, Db}; use mongodb::bson::doc; -use mongodb::options::FindOneOptions; -use rocket::serde::json::{Json, Value}; +use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] @@ -11,6 +10,6 @@ pub struct Options { } #[post("/settings/fetch", data = "")] -pub async fn req(/*user: UserRef,*/ options: Json) -> Result { - todo!() +pub async fn req(db: &Db, user: User, options: Json) -> Result> { + db.fetch_user_settings(&user.id, &options.into_inner().keys).await.map(Json) } diff --git a/src/routes/sync/get_unreads.rs b/src/routes/sync/get_unreads.rs index e63e209e..dcc24f19 100644 --- a/src/routes/sync/get_unreads.rs +++ b/src/routes/sync/get_unreads.rs @@ -1,9 +1,9 @@ -use revolt_quark::{Error, Result}; +use revolt_quark::{Result, models::{ChannelUnread, User}, Db}; use mongodb::bson::doc; -use rocket::serde::json::Value; +use rocket::serde::json::Json; #[get("/unreads")] -pub async fn req(/*user: UserRef*/) -> Result { - todo!() +pub async fn req(db: &Db, user: User) -> Result>> { + db.fetch_unreads(&user.id).await.map(Json) } diff --git a/src/routes/sync/set_settings.rs b/src/routes/sync/set_settings.rs index 9dee7548..75a30dfb 100644 --- a/src/routes/sync/set_settings.rs +++ b/src/routes/sync/set_settings.rs @@ -1,11 +1,9 @@ -use revolt_quark::{EmptyResponse, Result}; +use revolt_quark::models::User; +use revolt_quark::{EmptyResponse, Result, Db}; use chrono::prelude::*; -use mongodb::bson::{doc, to_bson}; -use mongodb::options::UpdateOptions; use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; -use serde_json::json; use std::collections::HashMap; type Data = HashMap; @@ -16,9 +14,26 @@ pub struct Options { } #[post("/settings/set?", data = "")] -pub async fn req( - /*user: UserRef,*/ data: Json, - options: Options, -) -> Result { - todo!() +pub async fn req(db: &Db, user: User, data: Json, options: Options) -> Result { + let data = data.into_inner(); + let current_time = Utc::now().timestamp_millis(); + let timestamp = if let Some(timestamp) = options.timestamp { + if timestamp > current_time { + current_time + } else { + timestamp + } + } else { + current_time + }; + + let mut settings = HashMap::new(); + for (key, data) in data { + settings.insert(key, ( + timestamp, + data + )); + } + + db.set_user_settings(&user.id, &settings).await.map(|_| EmptyResponse) }