diff --git a/crates/storage-pg/src/oauth2/session.rs b/crates/storage-pg/src/oauth2/session.rs index 3992615a..07982e22 100644 --- a/crates/storage-pg/src/oauth2/session.rs +++ b/crates/storage-pg/src/oauth2/session.rs @@ -1,4 +1,4 @@ -// Copyright 2022, 2023 The Matrix.org Foundation C.I.C. +// Copyright 2022-2024 The Matrix.org Foundation C.I.C. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -133,6 +133,14 @@ impl Filter for OAuth2SessionFilter<'_> { let scope: Vec = scope.iter().map(|s| s.as_str().to_owned()).collect(); Expr::col((OAuth2Sessions::Table, OAuth2Sessions::ScopeList)).contains(scope) })) + .add_option(self.last_active_after().map(|last_active_after| { + Expr::col((OAuth2Sessions::Table, OAuth2Sessions::LastActiveAt)) + .gt(last_active_after) + })) + .add_option(self.last_active_before().map(|last_active_before| { + Expr::col((OAuth2Sessions::Table, OAuth2Sessions::LastActiveAt)) + .lt(last_active_before) + })) } } diff --git a/crates/storage/src/oauth2/session.rs b/crates/storage/src/oauth2/session.rs index 1ecf5eb1..aacc99ff 100644 --- a/crates/storage/src/oauth2/session.rs +++ b/crates/storage/src/oauth2/session.rs @@ -48,6 +48,8 @@ pub struct OAuth2SessionFilter<'a> { client: Option<&'a Client>, state: Option, scope: Option<&'a Scope>, + last_active_before: Option>, + last_active_after: Option>, } impl<'a> OAuth2SessionFilter<'a> { @@ -102,6 +104,36 @@ impl<'a> OAuth2SessionFilter<'a> { self.client } + /// Only return sessions with a last active time before the given time + #[must_use] + pub fn with_last_active_before(mut self, last_active_before: DateTime) -> Self { + self.last_active_before = Some(last_active_before); + self + } + + /// Only return sessions with a last active time after the given time + #[must_use] + pub fn with_last_active_after(mut self, last_active_after: DateTime) -> Self { + self.last_active_after = Some(last_active_after); + self + } + + /// Get the last active before filter + /// + /// Returns [`None`] if no client filter was set + #[must_use] + pub fn last_active_before(&self) -> Option> { + self.last_active_before + } + + /// Get the last active after filter + /// + /// Returns [`None`] if no client filter was set + #[must_use] + pub fn last_active_after(&self) -> Option> { + self.last_active_after + } + /// Only return active sessions #[must_use] pub fn active_only(mut self) -> Self {