forked from jmug/stoatchat
104 lines
2.6 KiB
Rust
104 lines
2.6 KiB
Rust
use super::get_collection;
|
|
|
|
use bson::doc;
|
|
use mongodb::options::{FindOneOptions, FindOptions};
|
|
|
|
pub fn find_mutual_guilds(user_id: &str, target_id: &str) -> Vec<String> {
|
|
let col = get_collection("members");
|
|
if let Ok(result) = col.find(
|
|
doc! {
|
|
"$and": [
|
|
{ "id": user_id },
|
|
{ "id": target_id },
|
|
]
|
|
},
|
|
FindOptions::builder().projection(doc! { "_id": 1 }).build(),
|
|
) {
|
|
let mut results = vec![];
|
|
|
|
for doc in result {
|
|
if let Ok(guild) = doc {
|
|
results.push(guild.get_str("_id").unwrap().to_string());
|
|
}
|
|
}
|
|
|
|
results
|
|
} else {
|
|
vec![]
|
|
}
|
|
}
|
|
|
|
pub fn find_mutual_friends(user_id: &str, target_id: &str) -> Vec<String> {
|
|
let col = get_collection("users");
|
|
if let Ok(result) = col.find(
|
|
doc! {
|
|
"$and": [
|
|
{ "relations": { "$elemMatch": { "id": user_id, "status": 0 } } },
|
|
{ "relations": { "$elemMatch": { "id": target_id, "status": 0 } } },
|
|
]
|
|
},
|
|
FindOptions::builder().projection(doc! { "_id": 1 }).build(),
|
|
) {
|
|
let mut results = vec![];
|
|
|
|
for doc in result {
|
|
if let Ok(user) = doc {
|
|
results.push(user.get_str("_id").unwrap().to_string());
|
|
}
|
|
}
|
|
|
|
results
|
|
} else {
|
|
vec![]
|
|
}
|
|
}
|
|
|
|
pub fn find_mutual_groups(user_id: &str, target_id: &str) -> Vec<String> {
|
|
let col = get_collection("channels");
|
|
if let Ok(result) = col.find(
|
|
doc! {
|
|
"type": 1,
|
|
"$and": [
|
|
{ "recipients": user_id },
|
|
{ "recipients": target_id },
|
|
]
|
|
},
|
|
FindOptions::builder().projection(doc! { "_id": 1 }).build(),
|
|
) {
|
|
let mut results = vec![];
|
|
|
|
for doc in result {
|
|
if let Ok(group) = doc {
|
|
results.push(group.get_str("_id").unwrap().to_string());
|
|
}
|
|
}
|
|
|
|
results
|
|
} else {
|
|
vec![]
|
|
}
|
|
}
|
|
|
|
pub fn has_mutual_connection(user_id: &str, target_id: &str) -> bool {
|
|
let col = get_collection("guilds");
|
|
if let Ok(result) = col.find_one(
|
|
doc! {
|
|
"$and": [
|
|
{ "members": { "$elemMatch": { "id": user_id } } },
|
|
{ "members": { "$elemMatch": { "id": target_id } } },
|
|
]
|
|
},
|
|
FindOneOptions::builder()
|
|
.projection(doc! { "_id": 1 }) // ? TODO: fetch permissions
|
|
.build(),
|
|
) {
|
|
if result.is_some() {
|
|
true
|
|
} else {
|
|
false
|
|
}
|
|
} else {
|
|
false
|
|
}
|
|
}
|