From 957ee36f26ec83a31e08980196d8d9080f4b766e Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 11 Feb 2025 12:36:56 +0100 Subject: [PATCH] database: Add `crate_owner_invitations.expires_at` column --- crates/crates_io_database/src/schema.rs | 2 ++ crates/crates_io_database_dump/src/dump-db.toml | 1 + .../2025-02-11-122509_add-expires-at-column/down.sql | 1 + migrations/2025-02-11-122509_add-expires-at-column/up.sql | 7 +++++++ src/models/crate_owner_invitation.rs | 4 +++- src/models/krate.rs | 4 +++- 6 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 migrations/2025-02-11-122509_add-expires-at-column/down.sql create mode 100644 migrations/2025-02-11-122509_add-expires-at-column/up.sql diff --git a/crates/crates_io_database/src/schema.rs b/crates/crates_io_database/src/schema.rs index 7a8a3397877..6207fc4ba00 100644 --- a/crates/crates_io_database/src/schema.rs +++ b/crates/crates_io_database/src/schema.rs @@ -221,6 +221,8 @@ diesel::table! { /// /// (Automatically generated by Diesel.) token -> Text, + /// Point in time at which the invitation expires/expired. + expires_at -> Nullable, } } diff --git a/crates/crates_io_database_dump/src/dump-db.toml b/crates/crates_io_database_dump/src/dump-db.toml index b32a024db06..531a8132172 100644 --- a/crates/crates_io_database_dump/src/dump-db.toml +++ b/crates/crates_io_database_dump/src/dump-db.toml @@ -59,6 +59,7 @@ invited_by_user_id = "private" crate_id = "private" created_at = "private" token = "private" +expires_at = "private" [crate_owners] dependencies = ["crates", "users"] diff --git a/migrations/2025-02-11-122509_add-expires-at-column/down.sql b/migrations/2025-02-11-122509_add-expires-at-column/down.sql new file mode 100644 index 00000000000..c83de90bd93 --- /dev/null +++ b/migrations/2025-02-11-122509_add-expires-at-column/down.sql @@ -0,0 +1 @@ +alter table crate_owner_invitations drop column expires_at; diff --git a/migrations/2025-02-11-122509_add-expires-at-column/up.sql b/migrations/2025-02-11-122509_add-expires-at-column/up.sql new file mode 100644 index 00000000000..8f56b1fe85a --- /dev/null +++ b/migrations/2025-02-11-122509_add-expires-at-column/up.sql @@ -0,0 +1,7 @@ +alter table crate_owner_invitations add column expires_at timestamptz; + +comment on column public.crate_owner_invitations.expires_at is 'Point in time at which the invitation expires/expired.' + +-- to be performed manually after the migration: +-- +-- update table crate_owner_invitations set expires_at = now() + interval '30 day'; diff --git a/src/models/crate_owner_invitation.rs b/src/models/crate_owner_invitation.rs index 1b41ac0a5b1..8a4da066a30 100644 --- a/src/models/crate_owner_invitation.rs +++ b/src/models/crate_owner_invitation.rs @@ -1,4 +1,4 @@ -use chrono::{NaiveDateTime, Utc}; +use chrono::{DateTime, NaiveDateTime, Utc}; use diesel::prelude::*; use diesel_async::scoped_futures::ScopedFutureExt; use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl}; @@ -20,6 +20,7 @@ pub struct NewCrateOwnerInvitation { pub invited_user_id: i32, pub invited_by_user_id: i32, pub crate_id: i32, + pub expires_at: DateTime, } impl NewCrateOwnerInvitation { @@ -82,6 +83,7 @@ pub struct CrateOwnerInvitation { pub created_at: NaiveDateTime, #[diesel(deserialize_as = String)] pub token: SecretString, + pub expires_at: Option>, } impl CrateOwnerInvitation { diff --git a/src/models/krate.rs b/src/models/krate.rs index 8f60f639479..97e304ac83c 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -1,4 +1,4 @@ -use chrono::NaiveDateTime; +use chrono::{NaiveDateTime, Utc}; use diesel::associations::Identifiable; use diesel::dsl; use diesel::pg::Pg; @@ -401,10 +401,12 @@ impl Crate { match owner { // Users are invited and must accept before being added Owner::User(user) => { + let expires_at = Utc::now() + app.config.ownership_invitations_expiration; let invite = NewCrateOwnerInvitation { invited_user_id: user.id, invited_by_user_id: req_user.id, crate_id: self.id, + expires_at, }; let creation_ret = invite