mas_handlers/views/
index.rs

1// Copyright 2024 New Vector Ltd.
2// Copyright 2021-2024 The Matrix.org Foundation C.I.C.
3//
4// SPDX-License-Identifier: AGPL-3.0-only
5// Please see LICENSE in the repository root for full details.
6
7use axum::{
8    extract::State,
9    response::{Html, IntoResponse, Response},
10};
11use mas_axum_utils::{FancyError, cookies::CookieJar, csrf::CsrfExt};
12use mas_router::UrlBuilder;
13use mas_storage::{BoxClock, BoxRepository, BoxRng};
14use mas_templates::{IndexContext, TemplateContext, Templates};
15
16use crate::{
17    BoundActivityTracker,
18    preferred_language::PreferredLanguage,
19    session::{SessionOrFallback, load_session_or_fallback},
20};
21
22#[tracing::instrument(name = "handlers.views.index.get", skip_all, err)]
23pub async fn get(
24    mut rng: BoxRng,
25    clock: BoxClock,
26    activity_tracker: BoundActivityTracker,
27    State(templates): State<Templates>,
28    State(url_builder): State<UrlBuilder>,
29    mut repo: BoxRepository,
30    cookie_jar: CookieJar,
31    PreferredLanguage(locale): PreferredLanguage,
32) -> Result<Response, FancyError> {
33    let (cookie_jar, maybe_session) = match load_session_or_fallback(
34        cookie_jar, &clock, &mut rng, &templates, &locale, &mut repo,
35    )
36    .await?
37    {
38        SessionOrFallback::MaybeSession {
39            cookie_jar,
40            maybe_session,
41            ..
42        } => (cookie_jar, maybe_session),
43        SessionOrFallback::Fallback { response } => return Ok(response),
44    };
45
46    let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng);
47
48    if let Some(session) = maybe_session.as_ref() {
49        activity_tracker
50            .record_browser_session(&clock, session)
51            .await;
52    }
53
54    let ctx = IndexContext::new(url_builder.oidc_discovery())
55        .maybe_with_session(maybe_session)
56        .with_csrf(csrf_token.form_value())
57        .with_language(locale);
58
59    let content = templates.render_index(&ctx)?;
60
61    Ok((cookie_jar, Html(content)).into_response())
62}