diff --git a/Rocket.toml b/Rocket.toml index c9f4df8..5daaaa0 100644 --- a/Rocket.toml +++ b/Rocket.toml @@ -1,4 +1,6 @@ [default] secret_key = "8STDFCStGMYGoOq8RJf3JJXsg4p6wZVAph50R3Fbq6U=" +public_url = "http://localhost:8000/" + [default.databases.dolltags] url = "postgres://postgres:woofwoof@localhost/dolltags" diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..b6b8265 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,7 @@ +use rocket::serde::Deserialize; + +#[derive(Debug, Deserialize)] +#[serde(crate = "rocket::serde")] +pub struct Config { + pub public_url: String, +} diff --git a/src/main.rs b/src/main.rs index 20f9913..c790731 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ use std::path::PathBuf; use auth::session; use cli::check_cli_invocation; +use config::Config; use db::migrate::run_migrations; use db::schema::DollTags; use rocket::fairing::AdHoc; @@ -16,6 +17,7 @@ use routes::{account, admin, error_handlers, form, public}; pub mod auth; pub mod cli; +pub mod config; pub mod db; pub mod ids; pub mod pages; @@ -49,6 +51,7 @@ fn rocket() -> _ { rocket::build() .attach(pages::init_templates()) .attach(DollTags::init()) + .attach(AdHoc::config::()) .attach(AdHoc::try_on_ignite("SQLx migrations", run_migrations)) .attach(AdHoc::on_liftoff("CLI invocation hack", |rocket| { Box::pin(async move { check_cli_invocation(rocket).await }) diff --git a/src/pages.rs b/src/pages.rs index 80ca95c..8f6c8e7 100644 --- a/src/pages.rs +++ b/src/pages.rs @@ -5,12 +5,12 @@ use rocket::{ outcome::try_outcome, request::{FromRequest, Outcome}, serde::Serialize, - Request, + Request, State, }; use rocket_dyn_templates::{tera::try_get_value, Template}; use serde_json::{to_value, Value}; -use crate::{auth::session::Session, db::schema::User, ids}; +use crate::{auth::session::Session, config::Config, db::schema::User, ids}; pub fn init_templates() -> impl Fairing { Template::custom(|engines| { @@ -36,6 +36,8 @@ pub struct CommonTemplateState { pub is_admin: bool, /// feature flag - disables the UI for it since it's not implemeted yet. pub forgot_password_implemented: bool, + /// the website's public base URL (used for canonical URLs) + pub public_url: String, } impl CommonTemplateState { @@ -55,11 +57,13 @@ impl<'r> FromRequest<'r> for CommonTemplateState { async fn from_request(request: &'r Request<'_>) -> Outcome { let session_state = try_outcome!(request.guard::().await); + let config_state = try_outcome!(request.guard::<&State>().await); Outcome::Success(CommonTemplateState { logged_in: session_state.0.is_some(), is_admin: false, forgot_password_implemented: false, + public_url: config_state.public_url.clone(), }) } }