use sqlx::sqlite::SqlitePool; use super::create::Create; use crate::{ clock::DateTime, db, error::failed::{Failed, ResultExt as _}, event::Broadcaster, login::Login, name::Name, password::Password, }; pub struct Users { db: SqlitePool, events: Broadcaster, } impl Users { pub const fn new(db: SqlitePool, events: Broadcaster) -> Self { Self { db, events } } pub async fn create( &self, name: &Name, password: &Password, created_at: &DateTime, ) -> Result { let create = Create::begin(name, password, created_at); let validated = create.validate().fail("Failed to validate new user")?; let mut tx = self.db.begin().await.fail(db::failed::BEGIN)?; let stored = validated .store(&mut tx) .await .fail("Failed to store new user")?; tx.commit().await.fail(db::failed::COMMIT)?; let login = stored.login().to_owned(); stored.publish(&self.events); Ok(login) } }