fix: unify foreign user fetch into one method

This commit is contained in:
Paul Makles
2023-01-03 21:04:04 +00:00
parent ee1c4cc2d5
commit 27b4699299
3 changed files with 20 additions and 14 deletions

View File

@@ -1,8 +1,6 @@
use revolt_quark::{ use revolt_quark::{
models::{Member, User}, models::{Member, User},
perms, perms, Db, Ref, Result,
presence::presence_filter_online,
Db, Ref, Result,
}; };
use rocket::serde::json::Json; use rocket::serde::json::Json;
@@ -47,16 +45,7 @@ pub async fn req(
user_ids.push(member.id.user.clone()); user_ids.push(member.id.user.clone());
} }
let online_ids = presence_filter_online(&user_ids).await; let mut users = User::fetch_foreign_users(db, &user_ids).await?;
let mut users = db
.fetch_users(&user_ids)
.await?
.into_iter()
.map(|mut user| {
user.online = Some(online_ids.contains(&user.id));
user.foreign()
})
.collect::<Vec<User>>();
// Ensure the lists match up exactly. // Ensure the lists match up exactly.
members.sort_by(|a, b| a.id.user.cmp(&b.id.user)); members.sort_by(|a, b| a.id.user.cmp(&b.id.user));

View File

@@ -383,7 +383,7 @@ impl BulkMessageResponse {
) -> Result<BulkMessageResponse> { ) -> Result<BulkMessageResponse> {
if let Some(true) = include_users { if let Some(true) = include_users {
let user_ids = messages.get_user_ids(); let user_ids = messages.get_user_ids();
let users = db.fetch_users(&user_ids).await?; let users = User::fetch_foreign_users(db, &user_ids).await?;
Ok(match channel { Ok(match channel {
Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => {

View File

@@ -4,6 +4,7 @@ use crate::models::user::{
}; };
use crate::permissions::defn::UserPerms; use crate::permissions::defn::UserPerms;
use crate::permissions::r#impl::user::get_relationship; use crate::permissions::r#impl::user::get_relationship;
use crate::presence::presence_filter_online;
use crate::{perms, Database, Error, Result}; use crate::{perms, Database, Error, Result};
use futures::try_join; use futures::try_join;
@@ -67,6 +68,7 @@ impl User {
} }
/// Mutate the user object to remove redundant information /// Mutate the user object to remove redundant information
#[must_use]
pub fn foreign(mut self) -> User { pub fn foreign(mut self) -> User {
self.profile = None; self.profile = None;
self.relations = None; self.relations = None;
@@ -94,6 +96,21 @@ impl User {
self self
} }
/// Fetch foreign users by a list of IDs
pub async fn fetch_foreign_users(db: &Database, user_ids: &[String]) -> Result<Vec<User>> {
let online_ids = presence_filter_online(user_ids).await;
Ok(db
.fetch_users(user_ids)
.await?
.into_iter()
.map(|mut user| {
user.online = Some(online_ids.contains(&user.id));
user.foreign()
})
.collect::<Vec<User>>())
}
/// Mutate the user object to include relationship (if it does not already exist) /// Mutate the user object to include relationship (if it does not already exist)
#[must_use] #[must_use]
pub fn with_relationship(self, perspective: &User) -> User { pub fn with_relationship(self, perspective: &User) -> User {