You've already forked authentication-service
mirror of
https://github.com/matrix-org/matrix-authentication-service.git
synced 2025-07-29 22:01:14 +03:00
Remove the last authentication from the browser session model
This commit is contained in:
@ -12,10 +12,12 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
use async_graphql::{Description, Enum, Object, ID};
|
||||
use async_graphql::{Context, Description, Enum, Object, ID};
|
||||
use chrono::{DateTime, Utc};
|
||||
use mas_storage::{user::BrowserSessionRepository, RepositoryAccess};
|
||||
|
||||
use super::{NodeType, User};
|
||||
use crate::state::ContextExt;
|
||||
|
||||
/// A browser session represents a logged in user in a browser.
|
||||
#[derive(Description)]
|
||||
@ -50,8 +52,21 @@ impl BrowserSession {
|
||||
}
|
||||
|
||||
/// The most recent authentication of this session.
|
||||
async fn last_authentication(&self) -> Option<Authentication> {
|
||||
self.0.last_authentication.clone().map(Authentication)
|
||||
async fn last_authentication(
|
||||
&self,
|
||||
ctx: &Context<'_>,
|
||||
) -> Result<Option<Authentication>, async_graphql::Error> {
|
||||
let state = ctx.state();
|
||||
let mut repo = state.repository().await?;
|
||||
|
||||
let last_authentication = repo
|
||||
.browser_session()
|
||||
.get_last_authentication(&self.0)
|
||||
.await?;
|
||||
|
||||
repo.cancel().await?;
|
||||
|
||||
Ok(last_authentication.map(Authentication))
|
||||
}
|
||||
|
||||
/// When the object was created.
|
||||
|
@ -198,7 +198,7 @@ impl User {
|
||||
before: Option<String>,
|
||||
#[graphql(desc = "Returns the first *n* elements from the list.")] first: Option<i32>,
|
||||
#[graphql(desc = "Returns the last *n* elements from the list.")] last: Option<i32>,
|
||||
) -> Result<Connection<Cursor, BrowserSession>, async_graphql::Error> {
|
||||
) -> Result<Connection<Cursor, BrowserSession, PreloadedTotalCount>, async_graphql::Error> {
|
||||
let state = ctx.state();
|
||||
let mut repo = state.repository().await?;
|
||||
|
||||
@ -225,9 +225,20 @@ impl User {
|
||||
|
||||
let page = repo.browser_session().list(filter, pagination).await?;
|
||||
|
||||
// Preload the total count if requested
|
||||
let count = if ctx.look_ahead().field("totalCount").exists() {
|
||||
Some(repo.browser_session().count(filter).await?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
repo.cancel().await?;
|
||||
|
||||
let mut connection = Connection::new(page.has_previous_page, page.has_next_page);
|
||||
let mut connection = Connection::with_additional_fields(
|
||||
page.has_previous_page,
|
||||
page.has_next_page,
|
||||
PreloadedTotalCount(count),
|
||||
);
|
||||
connection.edges.extend(page.edges.into_iter().map(|u| {
|
||||
Edge::new(
|
||||
OpaqueCursor(NodeCursor(NodeType::BrowserSession, u.id)),
|
||||
@ -400,6 +411,17 @@ impl User {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct PreloadedTotalCount(Option<usize>);
|
||||
|
||||
#[Object]
|
||||
impl PreloadedTotalCount {
|
||||
/// Identifies the total count of items in the connection.
|
||||
async fn total_count(&self) -> Result<usize, async_graphql::Error> {
|
||||
self.0
|
||||
.ok_or_else(|| async_graphql::Error::new("total count not preloaded"))
|
||||
}
|
||||
}
|
||||
|
||||
/// A user email address
|
||||
#[derive(Description)]
|
||||
pub struct UserEmail(pub mas_data_model::UserEmail);
|
||||
|
Reference in New Issue
Block a user