move settings to a single cookie and fix it to be permanent

This commit is contained in:
mat 2024-07-03 21:02:18 -05:00
parent ae7ab53ab1
commit fdf8163fbb
2 changed files with 12 additions and 13 deletions

View File

@ -107,16 +107,14 @@ async fn config_middleware(
) -> Result<Response, StatusCode> { ) -> Result<Response, StatusCode> {
let mut config = config.clone().as_ref().clone(); let mut config = config.clone().as_ref().clone();
fn set_from_cookie(config: &mut String, cookies: &CookieJar, name: &str) { let settings_cookie = cookies.get("settings");
if let Some(cookie) = cookies.get(name) { if let Some(settings_cookie) = settings_cookie {
let value = cookie.value(); if let Ok(settings) = serde_json::from_str::<settings::Settings>(settings_cookie.value()) {
*config = value.to_string(); config.ui.stylesheet_url = settings.stylesheet_url;
config.ui.stylesheet_str = settings.stylesheet_str;
} }
} }
set_from_cookie(&mut config.ui.stylesheet_url, &cookies, "stylesheet-url");
set_from_cookie(&mut config.ui.stylesheet_str, &cookies, "stylesheet-str");
// modify the state // modify the state
req.extensions_mut().insert(config); req.extensions_mut().insert(config);

View File

@ -1,7 +1,7 @@
use axum::{ http::{header, StatusCode}, response::IntoResponse, Extension, Form}; use axum::{ http::{header, StatusCode}, response::IntoResponse, Extension, Form};
use axum_extra::extract::{cookie::Cookie, CookieJar}; use axum_extra::extract::{cookie::Cookie, CookieJar};
use maud::{html, Markup, PreEscaped, DOCTYPE}; use maud::{html, Markup, PreEscaped, DOCTYPE};
use serde::Deserialize; use serde::{Deserialize, Serialize};
use crate::{config::Config, web::head_html}; use crate::{config::Config, web::head_html};
@ -60,19 +60,20 @@ pub async fn get(
( [(header::CONTENT_TYPE, "text/html; charset=utf-8")], html) ( [(header::CONTENT_TYPE, "text/html; charset=utf-8")], html)
} }
#[derive(Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")] #[serde(rename_all = "kebab-case")]
pub struct Settings { pub struct Settings {
stylesheet_url: String, pub stylesheet_url: String,
stylesheet_str: String, pub stylesheet_str: String,
} }
pub async fn post( pub async fn post(
mut jar: CookieJar, mut jar: CookieJar,
Form(settings): Form<Settings>, Form(settings): Form<Settings>,
) -> impl IntoResponse { ) -> impl IntoResponse {
jar = jar.add(Cookie::new("stylesheet-url", settings.stylesheet_url)); let mut settings_cookie = Cookie::new("settings", serde_json::to_string(&settings).unwrap());
jar = jar.add(Cookie::new("stylesheet-str", settings.stylesheet_str)); settings_cookie.make_permanent();
jar = jar.add(settings_cookie);
( (
StatusCode::FOUND, StatusCode::FOUND,