feat(sync): implement settings and unreads fetch
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,5 +3,6 @@ Rocket.toml
|
|||||||
/target_backup
|
/target_backup
|
||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
.mongo
|
.mongo
|
||||||
|
.data
|
||||||
.env
|
.env
|
||||||
avatar.png
|
avatar.png
|
||||||
|
|||||||
@@ -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 rocket::serde::json::Json;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
@@ -11,33 +14,56 @@ pub enum Destination {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[post("/<target>/invite", data = "<dest>")]
|
#[post("/<target>/invite", data = "<dest>")]
|
||||||
pub async fn invite_bot(db: &Db, user: User, target: Ref, dest: Json<Destination>) -> Result<EmptyResponse> {
|
pub async fn invite_bot(
|
||||||
|
db: &Db,
|
||||||
|
user: User,
|
||||||
|
target: Ref,
|
||||||
|
dest: Json<Destination>,
|
||||||
|
) -> Result<EmptyResponse> {
|
||||||
if user.bot.is_some() {
|
if user.bot.is_some() {
|
||||||
return Err(Error::IsBot);
|
return Err(Error::IsBot);
|
||||||
}
|
}
|
||||||
|
|
||||||
let bot = target.as_bot(db).await?;
|
let bot = target.as_bot(db).await?;
|
||||||
if !bot.public && bot.owner != user.id {
|
if !bot.public && bot.owner != user.id {
|
||||||
return Err(Error::BotIsPrivate)
|
return Err(Error::BotIsPrivate);
|
||||||
}
|
}
|
||||||
|
|
||||||
match dest.into_inner() {
|
match dest.into_inner() {
|
||||||
Destination::Server { server } => {
|
Destination::Server { server } => {
|
||||||
let server = db.fetch_server(&server).await?;
|
let server = db.fetch_server(&server).await?;
|
||||||
if !perms(&user).server(&server).calc_server(db).await.get_manage_server() {
|
if !perms(&user)
|
||||||
return Err(Error::MissingPermission { permission: ServerPermission::ManageServer as i32 })
|
.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)
|
db.insert_member(&server.id, &bot.id)
|
||||||
},
|
.await
|
||||||
Destination::Group{ group } => {
|
.map(|_| EmptyResponse)
|
||||||
|
}
|
||||||
|
Destination::Group { group } => {
|
||||||
let channel = db.fetch_channel(&group).await?;
|
let channel = db.fetch_channel(&group).await?;
|
||||||
if !perms(&user).channel(&channel).calc_channel(db).await.get_invite_others() {
|
if !perms(&user)
|
||||||
return Err(Error::MissingPermission { permission: ChannelPermission::InviteOthers as i32 })
|
.channel(&channel)
|
||||||
|
.calc_channel(db)
|
||||||
|
.await
|
||||||
|
.get_invite_others()
|
||||||
|
{
|
||||||
|
return Err(Error::MissingPermission {
|
||||||
|
permission: ChannelPermission::InviteOthers as i32,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Channel::Group { id, .. } = channel {
|
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 {
|
} else {
|
||||||
Err(Error::InvalidOperation)
|
Err(Error::InvalidOperation)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,33 @@
|
|||||||
use revolt_quark::{EmptyResponse, Result};
|
use revolt_quark::{
|
||||||
|
models::{Invite, User},
|
||||||
|
perms, Db, EmptyResponse, Error, Ref, Result, ServerPermission,
|
||||||
|
};
|
||||||
|
|
||||||
#[delete("/<target>")]
|
#[delete("/<target>")]
|
||||||
pub async fn req(/*user: UserRef, target: Ref*/ target: String) -> Result<EmptyResponse> {
|
pub async fn req(db: &Db, user: User, target: Ref) -> Result<EmptyResponse> {
|
||||||
todo!()
|
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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use revolt_quark::models::File;
|
use revolt_quark::models::{Channel, File, Invite};
|
||||||
use revolt_quark::Result;
|
use revolt_quark::{Db, Ref, Result};
|
||||||
|
|
||||||
use rocket::serde::json::Value;
|
use rocket::serde::json::Json;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
#[derive(Serialize, Debug, Clone)]
|
#[derive(Serialize, Debug, Clone)]
|
||||||
@@ -26,6 +26,47 @@ pub enum InviteResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[get("/<target>")]
|
#[get("/<target>")]
|
||||||
pub async fn req(/*target: Ref*/ target: String) -> Result<Value> {
|
pub async fn req(db: &Db, target: Ref) -> Result<Json<InviteResponse>> {
|
||||||
todo!()
|
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!(),
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
use revolt_quark::{Error, Result};
|
use revolt_quark::{Result, models::{UserSettings, User}, Db};
|
||||||
|
|
||||||
use mongodb::bson::doc;
|
use mongodb::bson::doc;
|
||||||
use mongodb::options::FindOneOptions;
|
use rocket::serde::json::Json;
|
||||||
use rocket::serde::json::{Json, Value};
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
@@ -11,6 +10,6 @@ pub struct Options {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[post("/settings/fetch", data = "<options>")]
|
#[post("/settings/fetch", data = "<options>")]
|
||||||
pub async fn req(/*user: UserRef,*/ options: Json<Options>) -> Result<Value> {
|
pub async fn req(db: &Db, user: User, options: Json<Options>) -> Result<Json<UserSettings>> {
|
||||||
todo!()
|
db.fetch_user_settings(&user.id, &options.into_inner().keys).await.map(Json)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
use revolt_quark::{Error, Result};
|
use revolt_quark::{Result, models::{ChannelUnread, User}, Db};
|
||||||
|
|
||||||
use mongodb::bson::doc;
|
use mongodb::bson::doc;
|
||||||
use rocket::serde::json::Value;
|
use rocket::serde::json::Json;
|
||||||
|
|
||||||
#[get("/unreads")]
|
#[get("/unreads")]
|
||||||
pub async fn req(/*user: UserRef*/) -> Result<Value> {
|
pub async fn req(db: &Db, user: User) -> Result<Json<Vec<ChannelUnread>>> {
|
||||||
todo!()
|
db.fetch_unreads(&user.id).await.map(Json)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
use revolt_quark::{EmptyResponse, Result};
|
use revolt_quark::models::User;
|
||||||
|
use revolt_quark::{EmptyResponse, Result, Db};
|
||||||
|
|
||||||
use chrono::prelude::*;
|
use chrono::prelude::*;
|
||||||
use mongodb::bson::{doc, to_bson};
|
|
||||||
use mongodb::options::UpdateOptions;
|
|
||||||
use rocket::serde::json::Json;
|
use rocket::serde::json::Json;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::json;
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
type Data = HashMap<String, String>;
|
type Data = HashMap<String, String>;
|
||||||
@@ -16,9 +14,26 @@ pub struct Options {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[post("/settings/set?<options..>", data = "<data>")]
|
#[post("/settings/set?<options..>", data = "<data>")]
|
||||||
pub async fn req(
|
pub async fn req(db: &Db, user: User, data: Json<Data>, options: Options) -> Result<EmptyResponse> {
|
||||||
/*user: UserRef,*/ data: Json<Data>,
|
let data = data.into_inner();
|
||||||
options: Options,
|
let current_time = Utc::now().timestamp_millis();
|
||||||
) -> Result<EmptyResponse> {
|
let timestamp = if let Some(timestamp) = options.timestamp {
|
||||||
todo!()
|
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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user