diff options
Diffstat (limited to 'src/login/repo.rs')
| -rw-r--r-- | src/login/repo.rs | 153 |
1 files changed, 0 insertions, 153 deletions
diff --git a/src/login/repo.rs b/src/login/repo.rs deleted file mode 100644 index 128d6b8..0000000 --- a/src/login/repo.rs +++ /dev/null @@ -1,153 +0,0 @@ -use futures::stream::{StreamExt as _, TryStreamExt as _}; -use sqlx::{SqliteConnection, Transaction, sqlite::Sqlite}; - -use crate::{ - clock::DateTime, - event::{Instant, Sequence}, - login::{History, Id, Login, password::StoredHash}, - name::{self, Name}, -}; - -pub trait Provider { - fn logins(&mut self) -> Logins; -} - -impl Provider for Transaction<'_, Sqlite> { - fn logins(&mut self) -> Logins { - Logins(self) - } -} - -pub struct Logins<'t>(&'t mut SqliteConnection); - -impl Logins<'_> { - pub async fn create( - &mut self, - name: &Name, - password_hash: &StoredHash, - created: &Instant, - ) -> Result<History, sqlx::Error> { - let id = Id::generate(); - let display_name = name.display(); - let canonical_name = name.canonical(); - - sqlx::query!( - r#" - insert - into user (id, display_name, canonical_name, password_hash, created_sequence, created_at) - values ($1, $2, $3, $4, $5, $6) - "#, - id, - display_name, - canonical_name, - password_hash, - created.sequence, - created.at, - ) - .execute(&mut *self.0) - .await?; - - let login = History { - created: *created, - login: Login { - id, - name: name.clone(), - }, - }; - - Ok(login) - } - - pub async fn set_password( - &mut self, - login: &History, - to: &StoredHash, - ) -> Result<(), sqlx::Error> { - let login = login.id(); - - sqlx::query_scalar!( - r#" - update user - set password_hash = $1 - where id = $2 - returning id as "id: Id" - "#, - to, - login, - ) - .fetch_one(&mut *self.0) - .await?; - - Ok(()) - } - - pub async fn all(&mut self, resume_at: Sequence) -> Result<Vec<History>, LoadError> { - let logins = sqlx::query!( - r#" - select - id as "id: Id", - display_name as "display_name: String", - canonical_name as "canonical_name: String", - created_sequence as "created_sequence: Sequence", - created_at as "created_at: DateTime" - from user - where created_sequence <= $1 - order by canonical_name - "#, - resume_at, - ) - .map(|row| { - Ok::<_, LoadError>(History { - login: Login { - id: row.id, - name: Name::new(row.display_name, row.canonical_name)?, - }, - created: Instant::new(row.created_at, row.created_sequence), - }) - }) - .fetch(&mut *self.0) - .map(|res| res?) - .try_collect() - .await?; - - Ok(logins) - } - - pub async fn replay(&mut self, resume_at: Sequence) -> Result<Vec<History>, LoadError> { - let logins = sqlx::query!( - r#" - select - id as "id: Id", - display_name as "display_name: String", - canonical_name as "canonical_name: String", - created_sequence as "created_sequence: Sequence", - created_at as "created_at: DateTime" - from user - where created_sequence > $1 - "#, - resume_at, - ) - .map(|row| { - Ok::<_, name::Error>(History { - login: Login { - id: row.id, - name: Name::new(row.display_name, row.canonical_name)?, - }, - created: Instant::new(row.created_at, row.created_sequence), - }) - }) - .fetch(&mut *self.0) - .map(|res| Ok::<_, LoadError>(res??)) - .try_collect() - .await?; - - Ok(logins) - } -} - -#[derive(Debug, thiserror::Error)] -#[error(transparent)] -pub enum LoadError { - Database(#[from] sqlx::Error), - Name(#[from] name::Error), -} |
