use std::{env, sync::Arc}; use sqlx::{PgPool, Row}; mod user; pub use { user::User }; pub struct Database{ pool: PgPool } impl Database{ pub async fn new() -> anyhow::Result>{ let pool = PgPool::connect(&env::var("DB_URI")?).await?; sqlx::query( "CREATE TABLE IF NOT EXISTS Users ( id TEXT PRIMARY KEY, username TEXT UNIQUE, password TEXT );" ) .execute(&pool) .await?; Ok(Arc::new(Self { pool })) } pub async fn count_users( &self ) -> anyhow::Result{ let count = sqlx::query("SELECT COUNT(id) FROM Users") .fetch_one(&self.pool).await?; Ok(count.get("count")) } pub async fn get_user( &self, username: String ) -> anyhow::Result{ let user: User = sqlx::query_as("SELECT * FROM Users WHERE username = $1") .bind(username) .fetch_one(&self.pool) .await?; Ok(user) } pub async fn add_user( &self, user: User ) -> anyhow::Result<()>{ sqlx::query("INSERT INTO Users ( id, username, password ) VALUES ( $1, $2, $3 )") .bind(user.id) .bind(user.username) .bind(user.password) .execute(&self.pool) .await?; Ok(()) } }