Add channels field to guild object.

This commit is contained in:
Paul Makles
2020-08-12 11:45:05 +02:00
parent a8eb403280
commit 74b4238f04
9 changed files with 106 additions and 58 deletions

2
Cargo.lock generated
View File

@@ -1907,7 +1907,7 @@ dependencies = [
[[package]] [[package]]
name = "revolt" name = "revolt"
version = "0.2.7" version = "0.2.8"
dependencies = [ dependencies = [
"bcrypt", "bcrypt",
"bitfield", "bitfield",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "revolt" name = "revolt"
version = "0.2.7" version = "0.2.8"
authors = ["Paul Makles <paulmakles@gmail.com>"] authors = ["Paul Makles <paulmakles@gmail.com>"]
edition = "2018" edition = "2018"

View File

@@ -77,7 +77,7 @@ pub fn fetch_channel(id: &str) -> Result<Option<Channel>, String> {
} }
} }
pub fn fetch_channels(ids: &Vec<String>) -> Result<Option<Vec<Channel>>, String> { pub fn fetch_channels(ids: &Vec<String>) -> Result<Vec<Channel>, String> {
let mut missing = vec![]; let mut missing = vec![];
let mut channels = vec![]; let mut channels = vec![];
@@ -98,7 +98,7 @@ pub fn fetch_channels(ids: &Vec<String>) -> Result<Option<Vec<Channel>>, String>
} }
if missing.len() == 0 { if missing.len() == 0 {
return Ok(Some(channels)); return Ok(channels);
} }
let col = get_collection("channels"); let col = get_collection("channels");
@@ -117,7 +117,7 @@ pub fn fetch_channels(ids: &Vec<String>) -> Result<Option<Vec<Channel>>, String>
} }
} }
Ok(Some(channels)) Ok(channels)
} else { } else {
Err("Failed to fetch channel from database.".to_string()) Err("Failed to fetch channel from database.".to_string())
} }

View File

@@ -42,7 +42,7 @@ pub struct Guild {
pub description: String, pub description: String,
pub owner: String, pub owner: String,
// ? FIXME: ADD: pub channels: Vec<Channel>, pub channels: Vec<String>,
pub invites: Vec<Invite>, pub invites: Vec<Invite>,
pub bans: Vec<Ban>, pub bans: Vec<Ban>,

View File

@@ -2,6 +2,7 @@ use super::super::get_collection;
use serde::{Serialize, Deserialize}; use serde::{Serialize, Deserialize};
use mongodb::bson::{Bson, from_bson, doc}; use mongodb::bson::{Bson, from_bson, doc};
use mongodb::options::FindOptions;
use log::info; use log::info;
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
@@ -10,7 +11,7 @@ struct MigrationInfo {
revision: i32 revision: i32
} }
pub const LATEST_REVISION: i32 = 1; pub const LATEST_REVISION: i32 = 2;
pub fn migrate_database() { pub fn migrate_database() {
let migrations = get_collection("migrations"); let migrations = get_collection("migrations");
@@ -48,6 +49,60 @@ pub fn run_migrations(revision: i32) -> i32 {
info!("Running migration [revision 0]: Test migration system."); info!("Running migration [revision 0]: Test migration system.");
} }
if revision <= 1 {
info!("Running migration [revision 1]: Add channels to guild object.");
let col = get_collection("guilds");
let guilds = col.find(
None,
FindOptions::builder()
.projection(doc! { "_id": 1 })
.build()
)
.expect("Failed to fetch guilds.");
let result = get_collection("channels").find(
doc! {
"type": 2
},
FindOptions::builder()
.projection(doc! { "_id": 1, "guild": 1 })
.build()
).expect("Failed to fetch channels.");
let mut channels = vec![];
for doc in result {
let channel = doc.expect("Failed to fetch channel.");
let id = channel.get_str("_id").expect("Failed to get channel id.").to_string();
let gid = channel.get_str("guild").expect("Failed to get guild id.").to_string();
channels.push(( id, gid ));
}
for doc in guilds {
let guild = doc.expect("Failed to fetch guild.");
let id = guild.get_str("_id").expect("Failed to get guild id.");
let list: Vec<String> = channels
.iter()
.filter(|x| x.1 == id)
.map(|x| x.0.clone())
.collect();
col.update_one(
doc! {
"_id": id
},
doc! {
"$set": {
"channels": list
}
},
None
).expect("Failed to update guild.");
}
}
// Reminder to update LATEST_REVISION when adding new migrations. // Reminder to update LATEST_REVISION when adding new migrations.
LATEST_REVISION LATEST_REVISION
} }

View File

@@ -1,4 +1,3 @@
use mongodb::bson::doc;
use mongodb::sync::{Client, Collection, Database}; use mongodb::sync::{Client, Collection, Database};
use std::env; use std::env;

View File

@@ -138,11 +138,6 @@ pub fn channel(user: User, target: Channel) -> Option<Response> {
"recipients": target.recipients, "recipients": target.recipients,
}))), }))),
1 => { 1 => {
/*if let Some(info) = target.fetch_data(doc! {
"name": 1,
"description": 1,
"owner": 1,
}) {*/
Some(Response::Success(json!({ Some(Response::Success(json!({
"id": target.id, "id": target.id,
"type": target.channel_type, "type": target.channel_type,
@@ -152,15 +147,8 @@ pub fn channel(user: User, target: Channel) -> Option<Response> {
"owner": target.owner, "owner": target.owner,
"description": target.description, "description": target.description,
}))) })))
/*} else {
None
}*/
} }
2 => { 2 => {
/*if let Some(info) = target.fetch_data(doc! {
"name": 1,
"description": 1,
}) {*/
Some(Response::Success(json!({ Some(Response::Success(json!({
"id": target.id, "id": target.id,
"type": target.channel_type, "type": target.channel_type,
@@ -168,9 +156,6 @@ pub fn channel(user: User, target: Channel) -> Option<Response> {
"name": target.name, "name": target.name,
"description": target.description, "description": target.description,
}))) })))
/*} else {
None
}*/
} }
_ => unreachable!(), _ => unreachable!(),
} }
@@ -447,7 +432,8 @@ pub fn delete(user: User, target: Channel) -> Option<Response> {
"$pull": { "$pull": {
"invites": { "invites": {
"channel": &target.id "channel": &target.id
} },
"channels": &target.id
} }
}, },
None, None,

View File

@@ -2,7 +2,7 @@ use super::channel::ChannelType;
use super::Response; use super::Response;
use crate::database::guild::{fetch_member as get_member, get_invite, Guild, MemberKey}; use crate::database::guild::{fetch_member as get_member, get_invite, Guild, MemberKey};
use crate::database::{ use crate::database::{
self, channel::fetch_channel, channel::Channel, Permission, PermissionCalculator, user::User self, channel::{fetch_channel, fetch_channels}, channel::Channel, Permission, PermissionCalculator, user::User
}; };
use crate::notifications::{ use crate::notifications::{
self, self,
@@ -10,7 +10,7 @@ use crate::notifications::{
}; };
use crate::util::gen_token; use crate::util::gen_token;
use mongodb::bson::{doc, from_bson, Bson}; use mongodb::bson::{doc, Bson};
use mongodb::options::{FindOneOptions, FindOptions}; use mongodb::options::{FindOneOptions, FindOptions};
use rocket::request::Form; use rocket::request::Form;
use rocket_contrib::json::Json; use rocket_contrib::json::Json;
@@ -95,26 +95,15 @@ pub fn my_guilds(user: User) -> Response {
pub fn guild(user: User, target: Guild) -> Option<Response> { pub fn guild(user: User, target: Guild) -> Option<Response> {
with_permissions!(user, target); with_permissions!(user, target);
let col = database::get_collection("channels"); match fetch_channels(&target.channels) {
match col.find(
doc! {
"type": 2,
"guild": &target.id,
},
None,
) {
Ok(results) => { Ok(results) => {
let mut channels = vec![]; let mut channels = vec![];
for item in results { for item in results {
if let Ok(entry) = item { channels.push(json!({
if let Ok(channel) = from_bson(Bson::Document(entry)) as Result<Channel, _> { "id": item.id,
channels.push(json!({ "name": item.name,
"id": channel.id, "description": item.description,
"name": channel.name, }));
"description": channel.description,
}));
}
}
} }
Some(Response::Success(json!({ Some(Response::Success(json!({
@@ -127,7 +116,7 @@ pub fn guild(user: User, target: Guild) -> Option<Response> {
} }
Err(_) => Some(Response::InternalServerError( Err(_) => Some(Response::InternalServerError(
json!({ "error": "Failed to fetch channels." }), json!({ "error": "Failed to fetch channels." }),
)), ))
} }
} }
@@ -305,20 +294,39 @@ pub fn create_channel(user: User, target: Guild, info: Json<CreateChannel>) -> O
) )
.is_ok() .is_ok()
{ {
notifications::send_message_threaded( if database::get_collection("guilds")
None, .update_one(
target.id.clone(), doc! {
Notification::guild_channel_create(ChannelCreate { "_id": &target.id
id: target.id.clone(), },
channel: id.clone(), doc! {
name: name.clone(), "$addToSet": {
description: description.clone(), "channels": &id
}), }
); },
None
)
.is_ok()
{
notifications::send_message_threaded(
None,
target.id.clone(),
Notification::guild_channel_create(ChannelCreate {
id: target.id.clone(),
channel: id.clone(),
name: name.clone(),
description: description.clone(),
}),
);
Some(Response::Success(json!({ "id": &id }))) Some(Response::Success(json!({ "id": &id })))
} else {
Some(Response::InternalServerError(
json!({ "error": "Couldn't save channel list." }),
))
}
} else { } else {
Some(Response::BadRequest( Some(Response::InternalServerError(
json!({ "error": "Couldn't create channel." }), json!({ "error": "Couldn't create channel." }),
)) ))
} }

View File

@@ -6,11 +6,11 @@ use mongodb::bson::doc;
#[get("/")] #[get("/")]
pub fn root() -> Response { pub fn root() -> Response {
Response::Success(json!({ Response::Success(json!({
"revolt": "0.2.7", "revolt": "0.2.8",
"version": { "version": {
"major": 0, "major": 0,
"minor": 2, "minor": 2,
"patch": 7 "patch": 8
} }
})) }))
} }