mas_handlers/views/
index.rs1use 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}