summaryrefslogtreecommitdiff
path: root/src/login/repo.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/login/repo.rs')
-rw-r--r--src/login/repo.rs153
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),
-}