use sqlx::PgPool; use crate::core::*; use crate::model::{Account, AccountId, NewAccount}; pub struct PgAccountDataSource { pool: PgPool, } impl PgAccountDataSource { pub fn new(pool: PgPool) -> PgAccountDataSource { PgAccountDataSource { pool } } pub async fn by_id(&self, id: AccountId) -> Result { let account: Account = sqlx::query_as("SELECT * FROM accounts WHERE id = $1") .bind(id) .fetch_one(&self.pool) .await?; Ok(account) } pub async fn create(&self, new: NewAccount) -> Result { let account: Account = sqlx::query_as( "INSERT INTO accounts (iri, name, domain, display_name, public_key) VALUES ($1, $2, $3, $4, $5) RETURNING *", ) .bind(new.iri) .bind(new.name) .bind(new.domain) .bind(new.display_name) .bind(new.public_key) .fetch_one(&self.pool) .await?; Ok(account) } pub async fn delete(&self, id: AccountId) -> Result<()> { sqlx::query("DELETE FROM accounts WHERE id = $1") .bind(id) .execute(&self.pool) .await?; Ok(()) } }