use exun::*; use sqlx::{mysql::MySqlQueryResult, query, query_scalar, Executor, MySql, MySqlPool}; use uuid::Uuid; use crate::models::User; /// Intialize the connection pool pub async fn initialize(db: &str, user: &str, password: &str) -> Result { let url = format!("mysql://{user}:{password}@localhost/{db}"); MySqlPool::connect(&url).await.unexpect() } pub async fn user_id_exists<'c>( conn: impl Executor<'c, Database = MySql>, id: Uuid, ) -> Result { let exists = query_scalar!( r#"SELECT EXISTS(SELECT user_id FROM users WHERE user_id = ?) as "e: bool""#, id ) .fetch_one(conn) .await?; Ok(exists) } pub async fn username_is_used<'c>( conn: impl Executor<'c, Database = MySql>, username: &str, ) -> Result { let exists = query_scalar!( r#"SELECT EXISTS(SELECT user_id FROM users WHERE username = ?) as "e: bool""#, username ) .fetch_one(conn) .await?; Ok(exists) } pub async fn get_username<'c>( conn: impl Executor<'c, Database = MySql>, user_id: Uuid, ) -> Result, RawUnexpected> { let username = query_scalar!(r"SELECT username FROM users where user_id = ?", user_id) .fetch_optional(conn) .await?; Ok(username) } pub async fn new_user<'c>( conn: impl Executor<'c, Database = MySql>, user: &User, ) -> Result { query!( r"INSERT INTO users (user_id, username, password_hash, password_salt, password_version) VALUES (?, ?, ?, ?, ?)", user.user_id, user.username(), user.password_hash(), user.password_salt(), user.password_version() ) .execute(conn) .await } pub async fn update_username<'c>( conn: impl Executor<'c, Database = MySql>, user: &User, ) -> Result { query!( r"UPDATE users SET username = ?, password_hash = ?, password_salt = ?, password_version = ? WHERE user_id = ?", user.username(), user.password_hash(), user.password_salt(), user.password_version(), user.user_id ) .execute(conn) .await }