From 8a7711cabc928a3a3c6b6a82fb22eda24cec2695 Mon Sep 17 00:00:00 2001 From: Radical Date: Tue, 5 Aug 2025 03:28:02 +0200 Subject: [PATCH 1/3] feat: Make me optional in Member::fetch_one() --- src/objects/member.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/objects/member.rs b/src/objects/member.rs index 1247ea2..f7e56da 100644 --- a/src/objects/member.rs +++ b/src/objects/member.rs @@ -107,7 +107,7 @@ impl MemberBuilder { } } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Clone)] pub struct Member { pub uuid: Uuid, pub nickname: Option, @@ -150,14 +150,17 @@ impl Member { pub async fn fetch_one( conn: &mut Conn, cache_pool: &redis::Client, - me: &Me, + me: Option<&Me>, user_uuid: Uuid, guild_uuid: Uuid, ) -> Result { + let member: MemberBuilder; + let user: UserBuilder; + let friend: Option; use friends::dsl as fdsl; use guild_members::dsl; - let (member, user, friend): (MemberBuilder, UserBuilder, Option) = - dsl::guild_members + if let Some(me) = me { + (member, user, friend) = dsl::guild_members .filter(dsl::guild_uuid.eq(guild_uuid)) .filter(dsl::user_uuid.eq(user_uuid)) .inner_join(users::table) @@ -174,6 +177,17 @@ impl Member { )) .get_result(conn) .await?; + } else { + (member, user) = dsl::guild_members + .filter(dsl::guild_uuid.eq(guild_uuid)) + .filter(dsl::user_uuid.eq(user_uuid)) + .inner_join(users::table) + .select((MemberBuilder::as_select(), UserBuilder::as_select())) + .get_result(conn) + .await?; + + friend = None; + } member .build_with_parts(conn, cache_pool, user, friend) From 5b24d0052bcf9a0d80898eeeb20f0a9ce0696069 Mon Sep 17 00:00:00 2001 From: Radical Date: Tue, 5 Aug 2025 03:28:24 +0200 Subject: [PATCH 2/3] feat: return member with messages --- src/objects/message.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/objects/message.rs b/src/objects/message.rs index a5224e0..f30f14d 100644 --- a/src/objects/message.rs +++ b/src/objects/message.rs @@ -1,10 +1,15 @@ -use diesel::{Insertable, Queryable, Selectable}; +use diesel::{ExpressionMethods, Insertable, QueryDsl, Queryable, Selectable}; +use diesel_async::RunQueryDsl; use serde::Serialize; use uuid::Uuid; -use crate::{Conn, error::Error, schema::messages}; +use crate::{ + Conn, + error::Error, + schema::{channels, guilds, messages}, +}; -use super::User; +use super::Member; #[derive(Clone, Queryable, Selectable, Insertable)] #[diesel(table_name = messages)] @@ -23,7 +28,16 @@ impl MessageBuilder { conn: &mut Conn, cache_pool: &redis::Client, ) -> Result { - let user = User::fetch_one(conn, cache_pool, self.user_uuid).await?; + use channels::dsl; + + let guild_uuid = dsl::channels + .filter(dsl::uuid.eq(self.channel_uuid)) + .inner_join(guilds::table) + .select(guilds::uuid) + .get_result(conn) + .await?; + + let member = Member::fetch_one(conn, cache_pool, None, self.user_uuid, guild_uuid).await?; Ok(Message { uuid: self.uuid, @@ -31,7 +45,7 @@ impl MessageBuilder { user_uuid: self.user_uuid, message: self.message.clone(), reply_to: self.reply_to, - user, + member, }) } } @@ -43,5 +57,5 @@ pub struct Message { user_uuid: Uuid, message: String, reply_to: Option, - user: User, + member: Member, } From 447c577a2a2ae3071f21333e76a4ac3d89995316 Mon Sep 17 00:00:00 2001 From: Radical Date: Tue, 5 Aug 2025 03:28:35 +0200 Subject: [PATCH 3/3] style: cargo clippy & fmt --- src/objects/me.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/objects/me.rs b/src/objects/me.rs index 0c54570..167e61e 100644 --- a/src/objects/me.rs +++ b/src/objects/me.rs @@ -284,7 +284,7 @@ impl Me { cache_pool: &redis::Client, new_status: i16, ) -> Result<(), Error> { - if new_status > 4 || new_status < 0 { + if !(0..=4).contains(&new_status) { return Err(Error::BadRequest("Invalid status code".to_string())); } self.online_status = new_status;