forked from jmug/stoatchat
Add channels field to guild object.
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -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())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>,
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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." }),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user