summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-10-22 19:08:53 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-10-22 19:12:30 -0400
commitdb940bacd096a33a65f29759e70ea1acf6186a67 (patch)
treec6901c22a45e36415f63efe988d4d4f2a309df81 /src/login
parent3f9648eed48cd8b6cd35d0ae2ee5bbe25fa735ac (diff)
Provide `hi-recanonicalize` to recover from canonicalized-name problems.
Diffstat (limited to 'src/login')
-rw-r--r--src/login/app.rs22
-rw-r--r--src/login/mod.rs1
-rw-r--r--src/login/repo.rs33
3 files changed, 54 insertions, 2 deletions
diff --git a/src/login/app.rs b/src/login/app.rs
index 37f1249..2f5896f 100644
--- a/src/login/app.rs
+++ b/src/login/app.rs
@@ -1,6 +1,10 @@
use sqlx::sqlite::SqlitePool;
-use super::{repo::Provider as _, Login, Password};
+use super::repo::Provider as _;
+
+#[cfg(test)]
+use super::{Login, Password};
+#[cfg(test)]
use crate::{
clock::DateTime,
event::{repo::Provider as _, Broadcaster, Event},
@@ -9,14 +13,22 @@ use crate::{
pub struct Logins<'a> {
db: &'a SqlitePool,
+ #[cfg(test)]
events: &'a Broadcaster,
}
impl<'a> Logins<'a> {
+ #[cfg(not(test))]
+ pub const fn new(db: &'a SqlitePool) -> Self {
+ Self { db }
+ }
+
+ #[cfg(test)]
pub const fn new(db: &'a SqlitePool, events: &'a Broadcaster) -> Self {
Self { db, events }
}
+ #[cfg(test)]
pub async fn create(
&self,
name: &Name,
@@ -35,6 +47,14 @@ impl<'a> Logins<'a> {
Ok(login.as_created())
}
+
+ pub async fn recanonicalize(&self) -> Result<(), sqlx::Error> {
+ let mut tx = self.db.begin().await?;
+ tx.logins().recanonicalize().await?;
+ tx.commit().await?;
+
+ Ok(())
+ }
}
#[derive(Debug, thiserror::Error)]
diff --git a/src/login/mod.rs b/src/login/mod.rs
index 98cc3d7..64a3698 100644
--- a/src/login/mod.rs
+++ b/src/login/mod.rs
@@ -1,4 +1,3 @@
-#[cfg(test)]
pub mod app;
pub mod event;
pub mod extract;
diff --git a/src/login/repo.rs b/src/login/repo.rs
index 6021f26..c6bc734 100644
--- a/src/login/repo.rs
+++ b/src/login/repo.rs
@@ -89,6 +89,7 @@ impl<'c> Logins<'c> {
Ok(logins)
}
+
pub async fn replay(&mut self, resume_at: ResumePoint) -> Result<Vec<History>, LoadError> {
let logins = sqlx::query!(
r#"
@@ -119,6 +120,38 @@ impl<'c> Logins<'c> {
Ok(logins)
}
+
+ pub async fn recanonicalize(&mut self) -> Result<(), sqlx::Error> {
+ let logins = sqlx::query!(
+ r#"
+ select
+ id as "id: Id",
+ display_name as "display_name: String"
+ from login
+ "#,
+ )
+ .fetch_all(&mut *self.0)
+ .await?;
+
+ for login in logins {
+ let name = Name::from(login.display_name);
+ let canonical_name = name.canonical();
+
+ sqlx::query!(
+ r#"
+ update login
+ set canonical_name = $1
+ where id = $2
+ "#,
+ canonical_name,
+ login.id,
+ )
+ .execute(&mut *self.0)
+ .await?;
+ }
+
+ Ok(())
+ }
}
#[derive(Debug, thiserror::Error)]