this repo has no description
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}