From 3caefad767ecbaf3d82e943eeac0181d273577c0 Mon Sep 17 00:00:00 2001 From: Joe Ardent Date: Mon, 15 Jan 2024 15:11:39 -0800 Subject: [PATCH] update follows table, rename importer --- migrations/20230426221940_init.up.sql | 35 +++++++++++-------- .../20230427212229_update_triggers.up.sql | 19 ---------- src/bin/{import_omega.rs => import_imdb.rs} | 0 src/signup/handlers.rs | 3 +- src/users.rs | 21 ++++++++++- 5 files changed, 41 insertions(+), 37 deletions(-) rename src/bin/{import_omega.rs => import_imdb.rs} (100%) diff --git a/migrations/20230426221940_init.up.sql b/migrations/20230426221940_init.up.sql index 52a41ba..3fb4847 100644 --- a/migrations/20230426221940_init.up.sql +++ b/migrations/20230426221940_init.up.sql @@ -12,8 +12,13 @@ create table if not exists users ( last_seen int, pwhash blob not null, invited_by blob not null, - last_updated int not null default (unixepoch()) + is_active int not null default 1, + last_updated int not null default (unixepoch()), + foreign key (invited_by) references users (id) ); +create index if not exists users_username_dex on users (lower(username)); +create index if not exists users_email_dex on users (lower(email)); +create index if not exists users_invited_by_dex on users (invited_by); -- invitations create table if not exists invites ( @@ -24,6 +29,8 @@ create table if not exists invites ( last_updated int not null default (unixepoch()), foreign key (owner) references users (id) on delete cascade on update no action ); +create index if not exists invites_owner_dex on invites (owner); + -- table of things to watch create table if not exists watches ( @@ -37,6 +44,7 @@ create table if not exists watches ( last_updated int not null default (unixepoch()), foreign key (added_by) references users (id) ); +create index if not exists watches_title_dex on watches (lower(title)); -- table of what people want to watch create table if not exists watch_quests ( @@ -52,15 +60,18 @@ create table if not exists watch_quests ( foreign key (watch) references watches (id) on delete cascade on update no action, primary key (user, watch) ); +create index if not exists quests_user_dex on watch_quests (user); +create index if not exists quests_watch_dex on watch_quests (watch); - --- friend lists; created by trigger at the same time as the user, so no created_at needed create table if not exists follows ( - user blob not null primary key, - follows blob, -- possibly empty friends list in some app-specific format - last_updated int not null default (unixepoch()), - foreign key (user) references users (id) on delete cascade on update no action + follower blob not null, + followee blob not null, + created_at int not null default (unixepoch()), + foreign key (follower) references users (id) on delete cascade on update no action + foreign key (followee) references users (id) on delete cascade on update no action ); +create index if not exists follows_follower_dex on follows (follower); +create index if not exists follows_followee_dex on follows (followee); create table if not exists watch_notes ( id blob not null primary key default (julid_new()), -- a user can have multiple notes about the same thing @@ -72,13 +83,7 @@ create table if not exists watch_notes ( foreign key (user) references users (id) on delete cascade on update no action, foreign key (watch) references watches (id) on delete cascade on update no action ); - --- indices, not needed for follows -create index if not exists users_username_dex on users (lower(username)); -create index if not exists users_email_dex on users (lower(email)); -create index if not exists watches_title_dex on watches (lower(title)); -create index if not exists watches_added_by_dex on watches (added_by); -create index if not exists quests_user_dex on watch_quests (user); -create index if not exists quests_watch_dex on watch_quests (watch); create index if not exists notes_user_dex on watch_notes (user); create index if not exists notes_watch_dex on watch_notes (watch); + +-- indices diff --git a/migrations/20230427212229_update_triggers.up.sql b/migrations/20230427212229_update_triggers.up.sql index ce44b1e..8ff1523 100644 --- a/migrations/20230427212229_update_triggers.up.sql +++ b/migrations/20230427212229_update_triggers.up.sql @@ -12,18 +12,6 @@ BEGIN update invites set last_updated = (select unixepoch()) where id=NEW.id; END; -create trigger if not exists insert_user_follows - after insert on users -BEGIN - insert into follows (user) values (NEW.id); -END; - -create trigger if not exists delete_user_follows - after delete on users -BEGIN - delete from follows where user = OLD.id; -END; - create trigger if not exists update_last_updated_watches after update on watches when OLD.last_updated = NEW.last_updated or OLD.last_updated is null @@ -38,13 +26,6 @@ BEGIN update watch_quests set last_updated = (select unixepoch()) where watch=NEW.watch and user=NEW.user; END; -create trigger if not exists update_last_updated_follows - after update on follows - when OLD.last_updated = NEW.last_updated or OLD.last_updated is null -BEGIN - update follows set last_updated = (select unixepoch()) where id=NEW.id; -END; - create trigger if not exists update_last_updated_watch_notes after update on watch_notes when OLD.last_updated = NEW.last_updated or OLD.last_updated is null diff --git a/src/bin/import_omega.rs b/src/bin/import_imdb.rs similarity index 100% rename from src/bin/import_omega.rs rename to src/bin/import_imdb.rs diff --git a/src/signup/handlers.rs b/src/signup/handlers.rs index 1d9ccde..24f86e5 100644 --- a/src/signup/handlers.rs +++ b/src/signup/handlers.rs @@ -196,7 +196,6 @@ pub(crate) async fn create_user( })?; let invitation = Julid::from_str(invitation).map_err(|_| CreateUserErrorKind::BadInvitation)?; - let invited_by = validate_invitation(invitation, &mut tx).await?; let user = sqlx::query_as(CREATE_QUERY) @@ -444,7 +443,7 @@ mod test { .await .unwrap(); - std::thread::sleep(Duration::from_millis(100)); + std::thread::sleep(Duration::from_millis(500)); let username = "too slow"; diff --git a/src/users.rs b/src/users.rs index 9975169..8e13ee4 100644 --- a/src/users.rs +++ b/src/users.rs @@ -16,7 +16,7 @@ const LAST_SEEN_QUERY: &str = "update users set last_seen = (select unixepoch()) const INSERT_QUERY: &str = "insert into users (id, username, displayname, email, pwhash, invited_by) values ($1, $2, $3, $4, $5, $6)"; -#[derive(Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct User { pub id: Julid, pub username: String, @@ -25,6 +25,7 @@ pub struct User { pub last_seen: Option, pub pwhash: String, pub invited_by: Julid, + pub is_active: bool, pub digest: String, } @@ -39,12 +40,29 @@ impl sqlx::FromRow<'_, SqliteRow> for User { email: row.try_get("email")?, last_seen: row.try_get("last_seen")?, invited_by: row.try_get("invited_by")?, + is_active: row.try_get("is_active")?, pwhash, digest, }) } } +impl Default for User { + fn default() -> Self { + Self { + is_active: true, + id: Default::default(), + username: Default::default(), + displayname: Default::default(), + email: Default::default(), + last_seen: Default::default(), + pwhash: Default::default(), + invited_by: Default::default(), + digest: Default::default(), + } + } +} + impl Debug for User { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("User") @@ -55,6 +73,7 @@ impl Debug for User { .field("last_seen", &self.last_seen) .field("digest", &self.digest) .field("invited_by", &self.invited_by.as_string()) + .field("is_active", &self.is_active) .finish() } }