From 218d6dbb56727721d19019c8514f5e4395596e98 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Sun, 24 Aug 2025 15:35:39 -0400 Subject: Split the `user` table into an authentication portion and a chat portion. We'll be building separate entities around this in future commits, to better separate the authentication data (non-synchronized and indeed "not public") from the chat data (synchronized and public). --- src/invite/repo.rs | 3 ++- src/token/repo/auth.rs | 28 +++++++++++++++------------- src/token/repo/token.rs | 17 +++++++++-------- src/user/repo.rs | 47 +++++++++++++++++++++++++++++------------------ 4 files changed, 55 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/invite/repo.rs b/src/invite/repo.rs index 7cfa18e..934b0ce 100644 --- a/src/invite/repo.rs +++ b/src/invite/repo.rs @@ -71,10 +71,11 @@ impl Invites<'_> { select invite.id as "invite_id: Id", issuer.id as "issuer_id: user::Id", - issuer.display_name as "issuer_name: nfc::String", + issuer_login.display_name as "issuer_name: nfc::String", invite.issued_at as "invite_issued_at: DateTime" from invite join user as issuer on (invite.issuer = issuer.id) + join login as issuer_login on (issuer.id = issuer_login.id) where invite.id = $1 "#, invite, diff --git a/src/token/repo/auth.rs b/src/token/repo/auth.rs index 600855d..a42fa1a 100644 --- a/src/token/repo/auth.rs +++ b/src/token/repo/auth.rs @@ -28,13 +28,14 @@ impl Auth<'_> { r#" select id as "id: user::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", - password_hash as "password_hash: StoredHash" + 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", + login.password as "password: StoredHash" from user - where canonical_name = $1 + join login using (id) + where login.canonical_name = $1 "#, name, ) @@ -49,7 +50,7 @@ impl Auth<'_> { created: Instant::new(row.created_at, row.created_sequence), }; - Ok((login, row.password_hash)) + Ok((login, row.password)) } pub async fn for_user(&mut self, user: &User) -> Result<(History, StoredHash), LoadError> { @@ -57,12 +58,13 @@ impl Auth<'_> { r#" select id as "id: user::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", - password_hash as "password_hash: StoredHash" + 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", + login.password as "password: StoredHash" from user + join login using (id) where id = $1 "#, user.id, @@ -78,7 +80,7 @@ impl Auth<'_> { created: Instant::new(row.created_at, row.created_sequence), }; - Ok((user, row.password_hash)) + Ok((user, row.password)) } } diff --git a/src/token/repo/token.rs b/src/token/repo/token.rs index 7ac4ac5..5368fee 100644 --- a/src/token/repo/token.rs +++ b/src/token/repo/token.rs @@ -37,7 +37,7 @@ impl Tokens<'_> { let secret = sqlx::query_scalar!( r#" insert - into token (id, secret, user, issued_at, last_used_at) + into token (id, secret, login, issued_at, last_used_at) values ($1, $2, $3, $4, $4) returning secret as "secret!: Secret" "#, @@ -91,7 +91,7 @@ impl Tokens<'_> { r#" delete from token - where user = $1 + where login = $1 returning id as "id: Id" "#, user, @@ -139,12 +139,12 @@ impl Tokens<'_> { where secret = $2 returning id as "token: Id", - user as "user: user::Id" + login as "login: user::Id" "#, used_at, secret, ) - .map(|row| (row.token, row.user)) + .map(|row| (row.token, row.login)) .fetch_one(&mut *self.0) .await?; @@ -152,11 +152,12 @@ impl Tokens<'_> { r#" select id as "id: user::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" + 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" from user + join login using (id) where id = $1 "#, user, diff --git a/src/user/repo.rs b/src/user/repo.rs index 0f67e9a..bfb603d 100644 --- a/src/user/repo.rs +++ b/src/user/repo.rs @@ -25,7 +25,7 @@ impl Users<'_> { pub async fn create( &mut self, name: &Name, - password_hash: &StoredHash, + password: &StoredHash, created: &Instant, ) -> Result { let id = Id::generate(); @@ -34,14 +34,23 @@ impl Users<'_> { sqlx::query!( r#" - insert - into user (id, display_name, canonical_name, password_hash, created_sequence, created_at) - values ($1, $2, $3, $4, $5, $6) + insert into login (id, display_name, canonical_name, password) + values ($1, $2, $3, $4) "#, id, display_name, canonical_name, - password_hash, + password, + ) + .execute(&mut *self.0) + .await?; + + sqlx::query!( + r#" + insert into user (id, created_sequence, created_at) + values ($1, $2, $3) + "#, + id, created.sequence, created.at, ) @@ -68,8 +77,8 @@ impl Users<'_> { sqlx::query_scalar!( r#" - update user - set password_hash = $1 + update login + set password = $1 where id = $2 returning id as "id: Id" "#, @@ -87,13 +96,14 @@ impl Users<'_> { 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" + 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" from user - where created_sequence <= $1 - order by canonical_name + join login using (id) + where user.created_sequence <= $1 + order by canonical_name "#, resume_at, ) @@ -119,12 +129,13 @@ impl Users<'_> { 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" + 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" from user - where created_sequence > $1 + join login using (id) + where user.created_sequence > $1 "#, resume_at, ) -- cgit v1.2.3