Compare commits

..

3 commits

Author SHA1 Message Date
447c577a2a style: cargo clippy & fmt
All checks were successful
ci/woodpecker/push/build-and-publish Pipeline was successful
ci/woodpecker/push/publish-docs Pipeline was successful
2025-08-05 03:28:35 +02:00
5b24d0052b feat: return member with messages 2025-08-05 03:28:24 +02:00
8a7711cabc feat: Make me optional in Member::fetch_one() 2025-08-05 03:28:02 +02:00
3 changed files with 39 additions and 11 deletions

View file

@ -284,7 +284,7 @@ impl Me {
cache_pool: &redis::Client, cache_pool: &redis::Client,
new_status: i16, new_status: i16,
) -> Result<(), Error> { ) -> Result<(), Error> {
if new_status > 4 || new_status < 0 { if !(0..=4).contains(&new_status) {
return Err(Error::BadRequest("Invalid status code".to_string())); return Err(Error::BadRequest("Invalid status code".to_string()));
} }
self.online_status = new_status; self.online_status = new_status;

View file

@ -107,7 +107,7 @@ impl MemberBuilder {
} }
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub struct Member { pub struct Member {
pub uuid: Uuid, pub uuid: Uuid,
pub nickname: Option<String>, pub nickname: Option<String>,
@ -150,14 +150,17 @@ impl Member {
pub async fn fetch_one( pub async fn fetch_one(
conn: &mut Conn, conn: &mut Conn,
cache_pool: &redis::Client, cache_pool: &redis::Client,
me: &Me, me: Option<&Me>,
user_uuid: Uuid, user_uuid: Uuid,
guild_uuid: Uuid, guild_uuid: Uuid,
) -> Result<Self, Error> { ) -> Result<Self, Error> {
let member: MemberBuilder;
let user: UserBuilder;
let friend: Option<Friend>;
use friends::dsl as fdsl; use friends::dsl as fdsl;
use guild_members::dsl; use guild_members::dsl;
let (member, user, friend): (MemberBuilder, UserBuilder, Option<Friend>) = if let Some(me) = me {
dsl::guild_members (member, user, friend) = dsl::guild_members
.filter(dsl::guild_uuid.eq(guild_uuid)) .filter(dsl::guild_uuid.eq(guild_uuid))
.filter(dsl::user_uuid.eq(user_uuid)) .filter(dsl::user_uuid.eq(user_uuid))
.inner_join(users::table) .inner_join(users::table)
@ -174,6 +177,17 @@ impl Member {
)) ))
.get_result(conn) .get_result(conn)
.await?; .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 member
.build_with_parts(conn, cache_pool, user, friend) .build_with_parts(conn, cache_pool, user, friend)

View file

@ -1,10 +1,15 @@
use diesel::{Insertable, Queryable, Selectable}; use diesel::{ExpressionMethods, Insertable, QueryDsl, Queryable, Selectable};
use diesel_async::RunQueryDsl;
use serde::Serialize; use serde::Serialize;
use uuid::Uuid; 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)] #[derive(Clone, Queryable, Selectable, Insertable)]
#[diesel(table_name = messages)] #[diesel(table_name = messages)]
@ -23,7 +28,16 @@ impl MessageBuilder {
conn: &mut Conn, conn: &mut Conn,
cache_pool: &redis::Client, cache_pool: &redis::Client,
) -> Result<Message, Error> { ) -> Result<Message, Error> {
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 { Ok(Message {
uuid: self.uuid, uuid: self.uuid,
@ -31,7 +45,7 @@ impl MessageBuilder {
user_uuid: self.user_uuid, user_uuid: self.user_uuid,
message: self.message.clone(), message: self.message.clone(),
reply_to: self.reply_to, reply_to: self.reply_to,
user, member,
}) })
} }
} }
@ -43,5 +57,5 @@ pub struct Message {
user_uuid: Uuid, user_uuid: Uuid,
message: String, message: String,
reply_to: Option<Uuid>, reply_to: Option<Uuid>,
user: User, member: Member,
} }