From bfee640f0629f84c86cc152b755cc5861c810725 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 13 Feb 2026 14:51:41 +0100 Subject: [PATCH] feat(database/guild_user): adding the guild_user database wrapper --- src/database/guild_user.rs | 245 +++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 src/database/guild_user.rs diff --git a/src/database/guild_user.rs b/src/database/guild_user.rs new file mode 100644 index 0000000..49164c2 --- /dev/null +++ b/src/database/guild_user.rs @@ -0,0 +1,245 @@ +use sqlx::{PgPool, query, query_as, query_scalar}; +use crate::models::GuildUser; + +pub async fn get( + db: &PgPool, + user_id: &str, + guild_id: &str, +) -> Result, sqlx::Error> { + let guild_user = query_as::<_, guild_userildUser>( + "SELECT * FROM guild_users WHERE user_id = $1 AND guild_id = $2", + ) + .bind(user_id) + .bind(guild_id) + .fetch_optional(db) + .await?; + Ok(guild_user) +} + +pub async fn create( + db: &PgPool, + user_id: &str, + guild_id: &str, +) -> Result<(), sqlx::Error> { + query( + "INSERT INTO guild_users (user_id, guild_id) \ + VALUES ($1, $2) \ + ON CONFLICT (user_id, guild_id) DO NOTHING", + ) + .bind(user_id) + .bind(guild_id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn delete( + db: &PgPool, + user_id: &str, + guild_id: &str, +) -> Result<(), sqlx::Error> { + query( + "DELETE FROM guild_users WHERE user_id = $1 AND guild_id = $2", + ) + .bind(user_id) + .bind(guild_id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn delete_all_in_guild( + db: &PgPool, + guild_id: &str, +) -> Result<(), sqlx::Error> { + query("DELETE FROM guild_users WHERE guild_id = $1") + .bind(guild_id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn add_xp( + db: &PgPool, + user_id: &str, + guild_id: &str, + amount: i32, +) -> Result<(), sqlx::Error> { + query( + "UPDATE guild_users SET xp = xp + $1 \ + WHERE user_id = $2 AND guild_id = $3", + ) + .bind(amount) + .bind(user_id) + .bind(guild_id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn set_level( + db: &PgPool, + user_id: &str, + guild_id: &str, + level: i32, +) -> Result<(), sqlx::Error> { + query( + "UPDATE guild_users SET level = $1 \ + WHERE user_id = $2 AND guild_id = $3", + ) + .bind(level) + .bind(user_id) + .bind(guild_id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn get_xp( + db: &PgPool, + user_id: &str, + guild_id: &str, +) -> Result, sqlx::Error> { + let xp: Option = query_scalar( + "SELECT xp FROM guild_users WHERE user_id = $1 AND guild_id = $2", + ) + .bind(user_id) + .bind(guild_id) + .fetch_optional(db) + .await?; + Ok(xp) +} + +pub async fn get_level( + db: &PgPool, + user_id: &str, + guild_id: &str, +) -> Result, sqlx::Error> { + let level: Option = query_scalar( + "SELECT level FROM guild_users WHERE user_id = $1 AND guild_id = $2", + ) + .bind(user_id) + .bind(guild_id) + .fetch_optional(db) + .await?; + Ok(level) +} + +pub async fn set_wl( + db: &PgPool, + user_id: &str, + guild_id: &str, + value: bool, +) -> Result<(), sqlx::Error> { + query( + "UPDATE guild_users SET is_wl_user = $1 \ + WHERE user_id = $2 AND guild_id = $3", + ) + .bind(value) + .bind(user_id) + .bind(guild_id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn get_all_wl( + db: &PgPool, + guild_id: &str, +) -> Result, sqlx::Error> { + let users = query_as::<_, GuildUser>( + "SELECT * FROM guild_users \ + WHERE guild_id = $1 AND is_wl_user = true", + ) + .bind(guild_id) + .fetch_all(db) + .await?; + Ok(users) +} + +pub async fn set_invited_by( + db: &PgPool, + user_id: &str, + guild_id: &str, + inviter_id: &str, +) -> Result<(), sqlx::Error> { + query( + "UPDATE guild_users SET invited_by = $1 \ + WHERE user_id = $2 AND guild_id = $3", + ) + .bind(inviter_id) + .bind(user_id) + .bind(guild_id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn increment_invitations( + db: &PgPool, + user_id: &str, + guild_id: &str, +) -> Result<(), sqlx::Error> { + query( + "UPDATE guild_users SET invitation_count = invitation_count + 1 \ + WHERE user_id = $1 AND guild_id = $2", + ) + .bind(user_id) + .bind(guild_id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn decrement_invitations( + db: &PgPool, + user_id: &str, + guild_id: &str, +) -> Result<(), sqlx::Error> { + query( + "UPDATE guild_users SET invitation_count = GREATEST(invitation_count - 1, 0) \ + WHERE user_id = $1 AND guild_id = $2", + ) + .bind(user_id) + .bind(guild_id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn leaderboard_xp( + db: &PgPool, + guild_id: &str, + limit: i64, +) -> Result, sqlx::Error> { + let users = query_as::<_, GuildUser>( + "SELECT * FROM guild_users \ + WHERE guild_id = $1 \ + ORDER BY xp DESC \ + LIMIT $2", + ) + .bind(guild_id) + .bind(limit) + .fetch_all(db) + .await?; + Ok(users) +} + +pub async fn leaderboard_invitations( + db: &PgPool, + guild_id: &str, + limit: i64, +) -> Result, sqlx::Error> { + let users = query_as::<_, GuildUser>( + "SELECT * FROM guild_users \ + WHERE guild_id = $1 \ + ORDER BY invitation_count DESC \ + LIMIT $2", + ) + .bind(guild_id) + .bind(limit) + .fetch_all(db) + .await?; + Ok(users) +} +