diff --git a/crates/storage-pg/src/app_session.rs b/crates/storage-pg/src/app_session.rs index c0cbb896..80c8e3aa 100644 --- a/crates/storage-pg/src/app_session.rs +++ b/crates/storage-pg/src/app_session.rs @@ -239,6 +239,16 @@ fn split_filter( oauth2_filter = oauth2_filter.for_browser_session(browser_session); } + if let Some(last_active_before) = filter.last_active_before() { + compat_filter = compat_filter.with_last_active_before(last_active_before); + oauth2_filter = oauth2_filter.with_last_active_before(last_active_before); + } + + if let Some(last_active_after) = filter.last_active_after() { + compat_filter = compat_filter.with_last_active_after(last_active_after); + oauth2_filter = oauth2_filter.with_last_active_after(last_active_after); + } + (compat_filter, oauth2_filter) } diff --git a/crates/storage/src/app_session.rs b/crates/storage/src/app_session.rs index 06caffbf..9821b057 100644 --- a/crates/storage/src/app_session.rs +++ b/crates/storage/src/app_session.rs @@ -1,4 +1,4 @@ -// Copyright 2023 The Matrix.org Foundation C.I.C. +// Copyright 2023, 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. @@ -15,6 +15,7 @@ //! Repositories to interact with all kinds of sessions use async_trait::async_trait; +use chrono::{DateTime, Utc}; use mas_data_model::{BrowserSession, CompatSession, Device, Session, User}; use crate::{repository_impl, Page, Pagination}; @@ -59,6 +60,8 @@ pub struct AppSessionFilter<'a> { browser_session: Option<&'a BrowserSession>, state: Option, device_id: Option<&'a Device>, + last_active_before: Option>, + last_active_after: Option>, } impl<'a> AppSessionFilter<'a> { @@ -107,6 +110,36 @@ impl<'a> AppSessionFilter<'a> { self.device_id } + /// 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 compatibility sessions #[must_use] pub fn active_only(mut self) -> Self {