From 9ac477e9e91652706cced01b1bc9d757c3bd1365 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 11 Feb 2025 11:39:47 +0100 Subject: [PATCH] config/server: Convert `ownership_invitations_expiration_days` to `chrono::Duration` What's the point of a proper type system if we don't use it... :D --- src/config/server.rs | 4 ++-- src/controllers/crate_owner_invitation.rs | 4 ++-- src/models/crate_owner_invitation.rs | 3 +-- src/tests/owners.rs | 6 +++--- src/tests/util/test_app.rs | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/config/server.rs b/src/config/server.rs index f461f2efe49..119ed05db01 100644 --- a/src/config/server.rs +++ b/src/config/server.rs @@ -57,7 +57,7 @@ pub struct Server { pub domain_name: String, pub allowed_origins: AllowedOrigins, pub downloads_persist_interval: Duration, - pub ownership_invitations_expiration_days: u64, + pub ownership_invitations_expiration: chrono::Duration, pub metrics_authorization_token: Option, pub instance_metrics_log_every_seconds: Option, pub blocked_routes: HashSet, @@ -211,7 +211,7 @@ impl Server { downloads_persist_interval: var_parsed("DOWNLOADS_PERSIST_INTERVAL_MS")? .map(Duration::from_millis) .unwrap_or(Duration::from_secs(60)), - ownership_invitations_expiration_days: 30, + ownership_invitations_expiration: chrono::Duration::days(30), metrics_authorization_token: var("METRICS_AUTHORIZATION_TOKEN")?, instance_metrics_log_every_seconds: var_parsed("INSTANCE_METRICS_LOG_EVERY_SECONDS")?, blocked_routes: HashSet::from_iter(list("BLOCKED_ROUTES")?), diff --git a/src/controllers/crate_owner_invitation.rs b/src/controllers/crate_owner_invitation.rs index 7a50c0d0046..6afae1e3437 100644 --- a/src/controllers/crate_owner_invitation.rs +++ b/src/controllers/crate_owner_invitation.rs @@ -14,7 +14,7 @@ use axum::extract::{FromRequestParts, Path, Query}; use axum::Json; use axum_extra::json; use axum_extra::response::ErasedJson; -use chrono::{Duration, Utc}; +use chrono::Utc; use diesel::pg::Pg; use diesel::prelude::*; use diesel::sql_types::Bool; @@ -175,7 +175,7 @@ async fn prepare_list( }; // Load all the non-expired invitations matching the filter. - let expire_cutoff = Duration::days(config.ownership_invitations_expiration_days as i64); + let expire_cutoff = config.ownership_invitations_expiration; let query = crate_owner_invitations::table .filter(sql_filter) .filter(crate_owner_invitations::created_at.gt((Utc::now() - expire_cutoff).naive_utc())) diff --git a/src/models/crate_owner_invitation.rs b/src/models/crate_owner_invitation.rs index dfa2aa744cb..a8d6ea7dde2 100644 --- a/src/models/crate_owner_invitation.rs +++ b/src/models/crate_owner_invitation.rs @@ -172,7 +172,6 @@ impl CrateOwnerInvitation { } pub fn expires_at(&self, config: &config::Server) -> NaiveDateTime { - let days = chrono::Duration::days(config.ownership_invitations_expiration_days as i64); - self.created_at + days + self.created_at + config.ownership_invitations_expiration } } diff --git a/src/tests/owners.rs b/src/tests/owners.rs index 5bc857901c1..bd3e0eec678 100644 --- a/src/tests/owners.rs +++ b/src/tests/owners.rs @@ -9,7 +9,7 @@ use crate::views::{ }; use crate::schema::users; -use chrono::{Duration, Utc}; +use chrono::Utc; use diesel::prelude::*; use diesel_async::RunQueryDsl; use http::StatusCode; @@ -625,8 +625,8 @@ pub async fn expire_invitation(app: &TestApp, crate_id: i32) { let mut conn = app.db_conn().await; - let expiration = app.as_inner().config.ownership_invitations_expiration_days as i64; - let created_at = (Utc::now() - Duration::days(expiration)).naive_utc(); + let expiration = app.as_inner().config.ownership_invitations_expiration; + let created_at = (Utc::now() - expiration).naive_utc(); diesel::update(crate_owner_invitations::table) .set(crate_owner_invitations::created_at.eq(created_at)) diff --git a/src/tests/util/test_app.rs b/src/tests/util/test_app.rs index 6d457f2d110..7423b39de30 100644 --- a/src/tests/util/test_app.rs +++ b/src/tests/util/test_app.rs @@ -466,7 +466,7 @@ fn simple_config() -> config::Server { domain_name: "crates.io".into(), allowed_origins: Default::default(), downloads_persist_interval: Duration::from_secs(1), - ownership_invitations_expiration_days: 30, + ownership_invitations_expiration: chrono::Duration::days(30), metrics_authorization_token: None, instance_metrics_log_every_seconds: None, blocked_routes: HashSet::new(),