Skip to main content

potree_auth/render/http/
router.rs

1use std::sync::LazyLock;
2
3use axum::Extension;
4use axum::Router;
5use axum::routing::get;
6use web_route::ParameterizedRoute;
7use web_route::WebRoute;
8
9use super::super::application::service::RenderingService;
10use super::route_handlers;
11use super::state::State;
12use crate::common::utils::http::initialization_error::InitializationError;
13use crate::project::domain::ProjectId;
14use crate::render::http::middleware::potree_csp::set_potree_csp;
15
16pub static POTREE: LazyLock<ParameterizedRoute> =
17    LazyLock::new(|| ParameterizedRoute::new("/potree/{project_id}"));
18pub static PROJECT_DASHBOARD: LazyLock<ParameterizedRoute> =
19    LazyLock::new(|| ParameterizedRoute::new("/projects"));
20pub static NOT_FOUND: LazyLock<ParameterizedRoute> =
21    LazyLock::new(|| ParameterizedRoute::new("/404"));
22
23#[derive(serde::Deserialize)]
24pub(crate) struct PotreePathParams {
25    pub project_id: ProjectId,
26}
27
28/// Builds a routes for rendering HTML pages.
29///
30/// `login_route` defines where the user should be redirected if they need to be
31/// authenticated.
32pub fn build_router(
33    rendering_service: RenderingService,
34    login_route: WebRoute,
35) -> Result<Router, InitializationError> {
36    let state = State {
37        rendering_service,
38        login_route,
39    };
40
41    let router = Router::new()
42        .route(
43            &POTREE,
44            get(route_handlers::potree_render).layer(set_potree_csp()?),
45        )
46        .route(&PROJECT_DASHBOARD, get(route_handlers::project_dashboard))
47        .route(&NOT_FOUND, get(route_handlers::not_found))
48        .fallback(get(route_handlers::not_found))
49        .layer(Extension(state));
50
51    Ok(router)
52}