summaryrefslogtreecommitdiffstats
path: root/src/db
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/db/mod.rs18
-rw-r--r--src/db/users.rs68
2 files changed, 86 insertions, 0 deletions
diff --git a/src/db/mod.rs b/src/db/mod.rs
new file mode 100644
index 0000000..f010bf8
--- /dev/null
+++ b/src/db/mod.rs
@@ -0,0 +1,18 @@
+mod users;
+
+use sqlx::{Pool, Postgres};
+
+use self::users::Users;
+
+#[derive(Clone)]
+pub struct Database(Pool<Postgres>);
+
+impl Database {
+ pub fn new(pool: Pool<Postgres>) -> Self {
+ Self(pool)
+ }
+
+ pub fn users(&self) -> Users {
+ Users::new(self.0.clone())
+ }
+}
diff --git a/src/db/users.rs b/src/db/users.rs
new file mode 100644
index 0000000..0fc7c64
--- /dev/null
+++ b/src/db/users.rs
@@ -0,0 +1,68 @@
+use sqlx::{Pool, Postgres};
+
+use crate::users::User;
+use crate::Result;
+
+#[derive(Clone)]
+pub struct Users(Pool<Postgres>);
+// code code code code code code code code code code code code code code
+impl Users {
+ pub fn new(pool: Pool<Postgres>) -> Self {
+ Self(pool)
+ }
+
+ pub async fn create(&self, user: User) -> Result<()> {
+ sqlx::query!(
+ r#"insert into users (username, password, email, bio, site, privacy, admin) values ($1, $2, $3, $4, $5, $6, $7)"#,
+ user.username,
+ user.password,
+ user.email,
+ user.bio,
+ user.site,
+ user.privacy as _,
+ user.admin
+ )
+ .execute(&self.0)
+ .await?;
+ Ok(())
+ }
+
+ pub async fn read(&self, user_id: i32) -> Result<User> {
+ Ok(
+ sqlx::query_as!(
+ User,
+ "select username, password, email, bio, site, privacy as \"privacy: _\", admin from users where id = $1",
+ user_id
+ )
+ .fetch_one(&self.0)
+ .await?
+ )
+ }
+
+ pub async fn read_username(&self, username: &str) -> Result<User> {
+ Ok(
+ sqlx::query_as!(
+ User,
+ "select username, password, email, bio, site, privacy as \"privacy: _\", admin from users where username = $1",
+ username
+ )
+ .fetch_one(&self.0)
+ .await?
+ )
+ }
+
+ pub async fn get_id(&self, username: &str) -> Result<i32> {
+ Ok(
+ sqlx::query!("select id from users where username = $1", username)
+ .fetch_one(&self.0)
+ .await?
+ .id,
+ )
+ }
+
+ pub async fn read_all(&self) -> Result<Vec<User>> {
+ Ok(sqlx::query_as("select * from users")
+ .fetch_all(&self.0)
+ .await?)
+ }
+}