this repo has no description
at main 58 lines 1.2 kB view raw
1use std::{env, sync::Arc}; 2 3use sqlx::{PgPool, Row}; 4 5mod user; 6 7pub use { 8 user::User 9}; 10 11pub struct Database{ 12 pool: PgPool 13} 14 15impl Database{ 16 pub async fn new() -> anyhow::Result<Arc<Self>>{ 17 let pool = PgPool::connect(&env::var("DB_URI")?).await?; 18 19 sqlx::query( 20 "CREATE TABLE IF NOT EXISTS Users ( 21 id TEXT PRIMARY KEY, 22 username TEXT UNIQUE, 23 password TEXT 24 );" 25 ) 26 .execute(&pool) 27 .await?; 28 29 Ok(Arc::new(Self { pool })) 30 } 31 32 pub async fn count_users( &self ) -> anyhow::Result<i64>{ 33 let count = sqlx::query("SELECT COUNT(id) FROM Users") 34 .fetch_one(&self.pool).await?; 35 36 Ok(count.get("count")) 37 } 38 39 pub async fn get_user( &self, username: String ) -> anyhow::Result<User>{ 40 let user: User = sqlx::query_as("SELECT * FROM Users WHERE username = $1") 41 .bind(username) 42 .fetch_one(&self.pool) 43 .await?; 44 45 Ok(user) 46 } 47 48 pub async fn add_user( &self, user: User ) -> anyhow::Result<()>{ 49 sqlx::query("INSERT INTO Users ( id, username, password ) VALUES ( $1, $2, $3 )") 50 .bind(user.id) 51 .bind(user.username) 52 .bind(user.password) 53 .execute(&self.pool) 54 .await?; 55 56 Ok(()) 57 } 58}