summaryrefslogtreecommitdiff
path: root/src/repo
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-09-20 16:09:35 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-09-20 16:42:25 -0400
commitaafdeb9ffaf9a993ca4462b3422667e04469b2e3 (patch)
treeef2c0b8a8719a3ad511c80b38b3669d9f0c49157 /src/repo
parent8fe54f09aad3121d1cb9418087e46dc3a617463a (diff)
Expire messages after 90 days.
This is intended to manage storage growth. A community with broadly steady traffic will now reach a steady state (ish) where the amount of storage in use stays within a steady band. The 90 day threshold is a spitball; this should be made configurable for the community's needs. I've also hoisted expiry out into the `app` classes, to reduce the amount of non-database work repo types are doing. This should make it easier to make expiry configurable later on. Includes incidental cleanup and style changes.
Diffstat (limited to 'src/repo')
-rw-r--r--src/repo/login/extract.rs2
-rw-r--r--src/repo/token.rs14
2 files changed, 6 insertions, 10 deletions
diff --git a/src/repo/login/extract.rs b/src/repo/login/extract.rs
index a45a1cd..e808f4b 100644
--- a/src/repo/login/extract.rs
+++ b/src/repo/login/extract.rs
@@ -27,7 +27,7 @@ impl FromRequestParts<App> for Login {
let secret = identity_token.secret().ok_or(LoginError::Unauthorized)?;
let app = State::<App>::from_request_parts(parts, state).await?;
- match app.logins().validate(secret, used_at).await {
+ match app.logins().validate(secret, &used_at).await {
Ok(login) => Ok(login),
Err(ValidateError::InvalidToken) => Err(LoginError::Unauthorized),
Err(other) => Err(other.into()),
diff --git a/src/repo/token.rs b/src/repo/token.rs
index 5674c92..a2393e3 100644
--- a/src/repo/token.rs
+++ b/src/repo/token.rs
@@ -1,4 +1,3 @@
-use chrono::TimeDelta;
use sqlx::{sqlite::Sqlite, SqliteConnection, Transaction};
use uuid::Uuid;
@@ -61,19 +60,16 @@ impl<'c> Tokens<'c> {
Ok(())
}
- /// Expire and delete all tokens that haven't been used within the expiry
- /// interval (right now, 7 days) prior to `expire_at`. Tokens that are in
- /// use within that period will be retained.
- pub async fn expire(&mut self, expire_at: DateTime) -> Result<(), sqlx::Error> {
- // Somewhat arbitrarily, expire after 7 days.
- let expired_issue_at = expire_at - TimeDelta::days(7);
+ /// Expire and delete all tokens that haven't been used more recently than
+ /// ``expire_at``.
+ pub async fn expire(&mut self, expire_at: &DateTime) -> Result<(), sqlx::Error> {
sqlx::query!(
r#"
delete
from token
where last_used_at < $1
"#,
- expired_issue_at,
+ expire_at,
)
.execute(&mut *self.0)
.await?;
@@ -87,7 +83,7 @@ impl<'c> Tokens<'c> {
pub async fn validate(
&mut self,
secret: &str,
- used_at: DateTime,
+ used_at: &DateTime,
) -> Result<Login, sqlx::Error> {
// I would use `update … returning` to do this in one query, but
// sqlite3, as of this writing, does not allow an update's `returning`