feat!(database): adding the database Db* type

This commit is contained in:
Raphael 2026-02-13 19:50:36 +01:00 committed by Raphaël
parent 9303e8dd7f
commit 5ffb334130
5 changed files with 50 additions and 21 deletions

View file

@ -1,5 +1,5 @@
use sqlx::{PgPool, query, query_as}; use sqlx::{PgPool, query, query_as};
use crate::models::bot::{Bot, BotPresence, BotActivity}; use crate::models::bot::{DbBot, BotPresence, BotActivity};
const BOT_ID: i32 = 1; const BOT_ID: i32 = 1;
@ -11,8 +11,8 @@ pub async fn init(db: &PgPool) -> Result<(), sqlx::Error> {
Ok(()) Ok(())
} }
pub async fn get(db: &PgPool) -> Result<Option<Bot>, sqlx::Error> { pub async fn get(db: &PgPool) -> Result<Option<DbBot>, sqlx::Error> {
let bot = query_as::<_, Bot>( let bot = query_as::<_, DbBot>(
"SELECT * FROM bots WHERE id = $1", "SELECT * FROM bots WHERE id = $1",
) )
.bind(BOT_ID) .bind(BOT_ID)

View file

@ -1,9 +1,10 @@
use sqlx::{ use sqlx::{
PgPool, PgPool,
query,
query_as, query_as,
query_scalar, query_scalar,
}; };
use crate::models::Guild; use crate::models::DbGuild;
pub enum LogChannel { pub enum LogChannel {
Bot, Bot,
@ -63,8 +64,8 @@ pub async fn delete(db: &PgPool, guild_id: &str) -> Result<(), sqlx::Error> {
Ok(()) Ok(())
} }
pub async fn get(db: &PgPool, guild_id: &str) -> Result<Option<Guild>, sqlx::Error> { pub async fn get(db: &PgPool, guild_id: &str) -> Result<Option<DbGuild>, sqlx::Error> {
let guild: Option<Guild> = query_as::<_, Guild>( let guild: Option<DbGuild> = query_as::<_, DbGuild>(
"SELECT * FROM guilds WHERE guild_id = $1", "SELECT * FROM guilds WHERE guild_id = $1",
) )
.bind(guild_id) .bind(guild_id)
@ -110,3 +111,10 @@ pub async fn set_protect(db: &PgPool, user_id: &str, asked: Protect, value: &str
.await?; .await?;
Ok(()) Ok(())
} }
pub async fn get_or_create(db: &PgPool, guild_id: &str) -> Result<DbGuild, sqlx::Error> {
create(db, guild_id).await?;
get(db, guild_id)
.await?
.ok_or_else(|| sqlx::Error::RowNotFound)
}

View file

@ -1,12 +1,12 @@
use sqlx::{PgPool, query, query_as, query_scalar}; use sqlx::{PgPool, query, query_as, query_scalar};
use crate::models::GuildUser; use crate::models::guild_user::DbGuildUser;
pub async fn get( pub async fn get(
db: &PgPool, db: &PgPool,
user_id: &str, user_id: &str,
guild_id: &str, guild_id: &str,
) -> Result<Option<GuildUser>, sqlx::Error> { ) -> Result<Option<DbGuildUser>, sqlx::Error> {
let guild_user = query_as::<_, guild_userildUser>( let guild_user = query_as::<_, DbGuildUser>(
"SELECT * FROM guild_users WHERE user_id = $1 AND guild_id = $2", "SELECT * FROM guild_users WHERE user_id = $1 AND guild_id = $2",
) )
.bind(user_id) .bind(user_id)
@ -146,8 +146,8 @@ pub async fn set_wl(
pub async fn get_all_wl( pub async fn get_all_wl(
db: &PgPool, db: &PgPool,
guild_id: &str, guild_id: &str,
) -> Result<Vec<GuildUser>, sqlx::Error> { ) -> Result<Vec<DbGuildUser>, sqlx::Error> {
let users = query_as::<_, GuildUser>( let users = query_as::<_, DbGuildUser>(
"SELECT * FROM guild_users \ "SELECT * FROM guild_users \
WHERE guild_id = $1 AND is_wl_user = true", WHERE guild_id = $1 AND is_wl_user = true",
) )
@ -211,8 +211,8 @@ pub async fn leaderboard_xp(
db: &PgPool, db: &PgPool,
guild_id: &str, guild_id: &str,
limit: i64, limit: i64,
) -> Result<Vec<GuildUser>, sqlx::Error> { ) -> Result<Vec<DbGuildUser>, sqlx::Error> {
let users = query_as::<_, GuildUser>( let users = query_as::<_, DbGuildUser>(
"SELECT * FROM guild_users \ "SELECT * FROM guild_users \
WHERE guild_id = $1 \ WHERE guild_id = $1 \
ORDER BY xp DESC \ ORDER BY xp DESC \
@ -229,8 +229,8 @@ pub async fn leaderboard_invitations(
db: &PgPool, db: &PgPool,
guild_id: &str, guild_id: &str,
limit: i64, limit: i64,
) -> Result<Vec<GuildUser>, sqlx::Error> { ) -> Result<Vec<DbGuildUser>, sqlx::Error> {
let users = query_as::<_, GuildUser>( let users = query_as::<_, DbGuildUser>(
"SELECT * FROM guild_users \ "SELECT * FROM guild_users \
WHERE guild_id = $1 \ WHERE guild_id = $1 \
ORDER BY invitation_count DESC \ ORDER BY invitation_count DESC \
@ -242,4 +242,9 @@ pub async fn leaderboard_invitations(
.await?; .await?;
Ok(users) Ok(users)
} }
pub async fn get_or_create(db: &PgPool, user_id: &str, guild_id: &str) -> Result<DbGuildUser, sqlx::Error> {
create(db, user_id, guild_id).await?;
get(db, user_id, guild_id)
.await?
.ok_or_else(|| sqlx::Error::RowNotFound)
}

View file

@ -1 +1,10 @@
include!("./mod_gen.rs"); include!("./mod_gen.rs");
use sqlx::{Pool, Postgres};
use serenity::prelude::TypeMapKey;
pub struct DbPool;
impl TypeMapKey for DbPool {
type Value = Pool<Postgres>;
}

View file

@ -3,7 +3,7 @@ use sqlx::{
query, query,
query_as query_as
}; };
use crate::models::User; use crate::models::DbUser;
/// Adding the user (if exist do nothing) /// Adding the user (if exist do nothing)
/// ///
@ -26,7 +26,7 @@ pub async fn create(db: &PgPool, user_id: &str) -> Result<(), sqlx::Error> {
/// Take the database information of a user /// Take the database information of a user
/// ///
/// # Returns /// # Returns
/// [`User`] or `None` if the user doesn't exist /// [`DbUser`] or `None` if the user doesn't exist
/// ///
/// # Arguments /// # Arguments
/// ///
@ -36,9 +36,9 @@ pub async fn create(db: &PgPool, user_id: &str) -> Result<(), sqlx::Error> {
/// # Errors /// # Errors
/// ///
/// Returns `sqlx::Error` if the query fails. /// Returns `sqlx::Error` if the query fails.
pub async fn get(db: &PgPool, user_id: &str) -> Result<Option<User>, sqlx::Error> { pub async fn get(db: &PgPool, user_id: &str) -> Result<Option<DbUser>, sqlx::Error> {
let user: Option<User> = query_as::<_, User>( let user: Option<DbUser> = query_as::<_, DbUser>(
"SELECT user_id, is_owner, is_buyer, is_dev FROM users WHERE user_id = $1", "SELECT * FROM users WHERE user_id = $1",
) )
.bind(user_id) .bind(user_id)
.fetch_optional(db) .fetch_optional(db)
@ -85,3 +85,10 @@ pub async fn set_buyer(db: &PgPool, user_id: &str, value: bool) -> Result<(), sq
.await?; .await?;
Ok(()) Ok(())
} }
pub async fn get_or_create(db: &PgPool, user_id: &str) -> Result<DbUser, sqlx::Error> {
create(db, user_id).await?;
get(db, user_id)
.await?
.ok_or_else(|| sqlx::Error::RowNotFound)
}