diff options
| -rw-r--r-- | web/README.md | 21 | ||||
| -rw-r--r-- | web/template/Cargo.toml | 2 | ||||
| -rw-r--r-- | web/template/src/router.rs | 24 | ||||
| -rw-r--r-- | web/template/templates/layout.jinja | 1 |
4 files changed, 38 insertions, 10 deletions
diff --git a/web/README.md b/web/README.md index 01cf846..2f76393 100644 --- a/web/README.md +++ b/web/README.md @@ -1,10 +1,15 @@ # web template -* Axum -* Graceful Shutdown -* Minijinja -* Prometheus -* Middleware Ip -* Config -* Tracing -* 404 +* [x] Axum +* [x] Graceful Shutdown +* [x] Minijinja +* [x] Prometheus +* [ ] Middleware Ip +* [x] Request Id Header +* [x] Static files +* [ ] Config +* [x] Tracing +* [ ] Messages (like flask) +* [x] Sessions +* [ ] CSRF +* [ ] 404 diff --git a/web/template/Cargo.toml b/web/template/Cargo.toml index 4d421e1..63bc87a 100644 --- a/web/template/Cargo.toml +++ b/web/template/Cargo.toml @@ -13,8 +13,10 @@ metrics = { version = "=0.24.2", default-features = false } metrics-exporter-prometheus = { version = "=0.17.2", default-features = false } minijinja = "=2.12.0" serde = { version = "=1.0.228", features = ["derive"] } +time = "=0.3.44" tokio = { version = "=1.48.0", features = ["macros", "rt-multi-thread", "signal"] } tower-http = { version = "=0.6.6", features = ["timeout", "trace", "fs", "request-id"] } +tower-sessions = "=0.14.0" tracing = "=0.1.41" tracing-subscriber = { version = "=0.3.20", features = ["env-filter"] } diff --git a/web/template/src/router.rs b/web/template/src/router.rs index 1e00216..45112a3 100644 --- a/web/template/src/router.rs +++ b/web/template/src/router.rs @@ -13,7 +13,7 @@ // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // -use std::{sync::Arc, time::Duration}; +use std::sync::Arc; use axum::{ Router, @@ -24,6 +24,8 @@ use axum::{ routing::get, }; use minijinja::context; +use serde::{Deserialize, Serialize}; +use time::Duration; use tower_http::{ request_id::{ MakeRequestUuid, PropagateRequestIdLayer, SetRequestIdLayer, @@ -32,20 +34,28 @@ use tower_http::{ timeout::TimeoutLayer, trace::TraceLayer, }; +use tower_sessions::{Expiry, MemoryStore, Session, SessionManagerLayer}; use tracing::{error, info_span}; use crate::metric::track_metrics; use crate::state::AppState; +const COUNTER_KEY: &str = "counter"; const REQUEST_ID_HEADER: &str = "x-request-id"; +#[derive(Default, Deserialize, Serialize)] +struct Counter(usize); + pub(crate) fn route(app_state: Arc<AppState>) -> Router { let x_request_id = HeaderName::from_static(REQUEST_ID_HEADER); + let session_store = MemoryStore::default(); + Router::new() .route("/", get(handler_home)) .route("/content", get(handler_content)) .route("/about", get(handler_about)) + .route("/session", get(handler_session)) // TODO(msi): from config folder asssets .nest_service("/assets", ServeDir::new("assets")) .layer(( @@ -67,8 +77,11 @@ pub(crate) fn route(app_state: Arc<AppState>) -> Router { } }, ), + SessionManagerLayer::new(session_store) + .with_secure(false) + .with_expiry(Expiry::OnInactivity(Duration::seconds(10))), // TODO(msi): from config - TimeoutLayer::new(Duration::from_secs(10)), + TimeoutLayer::new(std::time::Duration::from_secs(10)), PropagateRequestIdLayer::new(x_request_id), )) .route_layer(middleware::from_fn(track_metrics)) @@ -76,6 +89,13 @@ pub(crate) fn route(app_state: Arc<AppState>) -> Router { .with_state(app_state) } +async fn handler_session(session: Session) -> impl IntoResponse { + let counter: Counter = + session.get(COUNTER_KEY).await.unwrap().unwrap_or_default(); + session.insert(COUNTER_KEY, counter.0 + 1).await.unwrap(); + format!("Current count: {}", counter.0) +} + async fn healthz() -> impl IntoResponse { StatusCode::OK } diff --git a/web/template/templates/layout.jinja b/web/template/templates/layout.jinja index 02232bc..1ee943a 100644 --- a/web/template/templates/layout.jinja +++ b/web/template/templates/layout.jinja @@ -8,6 +8,7 @@ <li><a href="/">Home</a></li> <li><a href="/content">Content</a></li> <li><a href="/about">About</a></li> + <li><a href="/session">Session</a></li> </ul> </nav> <h1><h1>Hello, World web =]</h1> |