diff options
Diffstat (limited to 'src/user/repo.rs')
| -rw-r--r-- | src/user/repo.rs | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/src/user/repo.rs b/src/user/repo.rs index aaf3b73..292d72e 100644 --- a/src/user/repo.rs +++ b/src/user/repo.rs @@ -1,13 +1,13 @@ use futures::stream::{StreamExt as _, TryStreamExt as _}; use sqlx::{SqliteConnection, Transaction, sqlite::Sqlite}; +use super::{Event, History, Id, User, event::Created}; use crate::{ clock::DateTime, db::NotFound, event::{Instant, Sequence}, login::Login, name::{self, Name}, - user::{History, Id, User}, }; pub trait Provider { @@ -23,30 +23,39 @@ impl Provider for Transaction<'_, Sqlite> { pub struct Users<'t>(&'t mut SqliteConnection); impl Users<'_> { - pub async fn create( + pub async fn record_events( &mut self, - login: &Login, - created: &Instant, - ) -> Result<History, sqlx::Error> { + events: impl IntoIterator<Item = Event>, + ) -> Result<(), sqlx::Error> { + for event in events { + self.record_event(&event).await?; + } + Ok(()) + } + + pub async fn record_event(&mut self, event: &Event) -> Result<(), sqlx::Error> { + match event { + Event::Created(created) => self.record_created(created).await, + } + } + + async fn record_created(&mut self, created: &Created) -> Result<(), sqlx::Error> { + let Created { user, instant } = created; + sqlx::query!( r#" - insert into user (id, created_sequence, created_at) + insert + into user (id, created_at, created_sequence) values ($1, $2, $3) "#, - login.id, - created.sequence, - created.at, + user.id, + instant.at, + instant.sequence, ) .execute(&mut *self.0) .await?; - Ok(History { - user: User { - id: login.id.clone().into(), - name: login.name.clone(), - }, - created: *created, - }) + Ok(()) } pub async fn by_login(&mut self, login: &Login) -> Result<History, LoadError> { @@ -86,12 +95,11 @@ impl Users<'_> { id as "id: Id", login.display_name as "display_name: String", login.canonical_name as "canonical_name: String", - user.created_sequence as "created_sequence: Sequence", - user.created_at as "created_at: DateTime" + user.created_at as "created_at: DateTime", + user.created_sequence as "created_sequence: Sequence" from user join login using (id) where user.created_sequence <= $1 - order by canonical_name "#, resume_at, ) @@ -119,8 +127,8 @@ impl Users<'_> { id as "id: Id", login.display_name as "display_name: String", login.canonical_name as "canonical_name: String", - user.created_sequence as "created_sequence: Sequence", - user.created_at as "created_at: DateTime" + user.created_at as "created_at: DateTime", + user.created_sequence as "created_sequence: Sequence" from user join login using (id) where user.created_sequence > $1 |
