diff --git a/maskinrommet/src/publishing.rs b/maskinrommet/src/publishing.rs index d906679..81decc5 100644 --- a/maskinrommet/src/publishing.rs +++ b/maskinrommet/src/publishing.rs @@ -329,6 +329,7 @@ pub fn render_article( collection_title: &str, base_url: &str, seo: &SeoData, + has_rss: bool, ) -> Result { let css_vars = build_css_variables(theme, config); let template_name = format!("{theme}/article.html"); @@ -341,6 +342,7 @@ pub fn render_article( ctx.insert("base_url", base_url); ctx.insert("logo_hash", &config.logo_hash); ctx.insert("seo", seo); + ctx.insert("has_rss", &has_rss); tera.render(&template_name, &ctx) } @@ -352,6 +354,7 @@ pub fn render_index( config: &ThemeConfig, index: &IndexData, base_url: &str, + has_rss: bool, ) -> Result { let css_vars = build_css_variables(theme, config); let template_name = format!("{theme}/index.html"); @@ -362,6 +365,7 @@ pub fn render_index( ctx.insert("index", index); ctx.insert("base_url", base_url); ctx.insert("logo_hash", &config.logo_hash); + ctx.insert("has_rss", &has_rss); tera.render(&template_name, &ctx) } @@ -405,13 +409,16 @@ pub async fn render_article_to_cas( return Err(format!("Samling {collection_id} finnes ikke")); }; - let publishing_config: PublishingConfig = collection_metadata - .get("traits") + let coll_traits = collection_metadata.get("traits"); + + let publishing_config: PublishingConfig = coll_traits .and_then(|t| t.get("publishing")) .cloned() .map(|v| serde_json::from_value(v).unwrap_or_default()) .unwrap_or_default(); + let has_rss = coll_traits.and_then(|t| t.get("rss")).is_some(); + let slug = publishing_config.slug.as_deref().unwrap_or("unknown"); let theme = publishing_config.theme.as_deref().unwrap_or("blogg"); let config = &publishing_config.theme_config; @@ -496,7 +503,7 @@ pub async fn render_article_to_cas( let seo = build_seo_data(&article_data, &collection_title, &canonical_url); let tera = build_tera(); - let html = render_article(&tera, theme, config, &article_data, &collection_title, &base_url, &seo) + let html = render_article(&tera, theme, config, &article_data, &collection_title, &base_url, &seo, has_rss) .map_err(|e| format!("Tera render-feil: {e}"))?; // 5. Lagre i CAS @@ -586,13 +593,16 @@ pub async fn render_index_to_cas( return Err(format!("Samling {collection_id} finnes ikke")); }; - let publishing_config: PublishingConfig = collection_metadata - .get("traits") + let idx_traits = collection_metadata.get("traits"); + + let publishing_config: PublishingConfig = idx_traits .and_then(|t| t.get("publishing")) .cloned() .map(|v| serde_json::from_value(v).unwrap_or_default()) .unwrap_or_default(); + let has_rss = idx_traits.and_then(|t| t.get("rss")).is_some(); + let slug = publishing_config.slug.as_deref().unwrap_or("unknown"); let theme = publishing_config.theme.as_deref().unwrap_or("blogg"); let config = &publishing_config.theme_config; @@ -621,7 +631,7 @@ pub async fn render_index_to_cas( // Render med Tera let tera = build_tera(); - let html = render_index(&tera, theme, config, &index_data, &base_url) + let html = render_index(&tera, theme, config, &index_data, &base_url, has_rss) .map_err(|e| format!("Tera render-feil (index): {e}"))?; // Lagre i CAS @@ -691,6 +701,7 @@ struct CollectionRow { id: Uuid, title: Option, publishing_config: PublishingConfig, + has_rss: bool, } /// Finn samling med publishing-trait basert på slug. @@ -715,17 +726,23 @@ async fn find_publishing_collection( return Ok(None); }; - let publishing_config: PublishingConfig = metadata - .get("traits") + let traits = metadata.get("traits"); + + let publishing_config: PublishingConfig = traits .and_then(|t| t.get("publishing")) .cloned() .map(|v| serde_json::from_value(v).unwrap_or_default()) .unwrap_or_default(); + let has_rss = traits + .and_then(|t| t.get("rss")) + .is_some(); + Ok(Some(CollectionRow { id, title, publishing_config, + has_rss, })) } @@ -1093,7 +1110,7 @@ pub async fn serve_index( }; let tera = build_tera(); - let html = render_index(&tera, theme, &config, &index_data, &base_url).map_err(|e| { + let html = render_index(&tera, theme, &config, &index_data, &base_url, collection.has_rss).map_err(|e| { tracing::error!(slug = %slug, theme = %theme, error = %e, "Tera render-feil (index)"); StatusCode::INTERNAL_SERVER_ERROR })?; @@ -1178,7 +1195,7 @@ pub async fn serve_article( let seo = build_seo_data(&fetched.article, &collection_title, &canonical_url); let tera = build_tera(); - let html = render_article(&tera, theme, config, &fetched.article, &collection_title, &base_url, &seo) + let html = render_article(&tera, theme, config, &fetched.article, &collection_title, &base_url, &seo, collection.has_rss) .map_err(|e| { tracing::error!(slug = %slug, article = %article_id, theme = %theme, error = %e, "Tera render-feil (artikkel)"); StatusCode::INTERNAL_SERVER_ERROR @@ -1229,7 +1246,7 @@ pub async fn preview_theme( let base_url = format!("/pub/{slug}"); let tera = build_tera(); - let html = render_index(&tera, &theme, &config, &index_data, &base_url).map_err(|e| { + let html = render_index(&tera, &theme, &config, &index_data, &base_url, false).map_err(|e| { tracing::error!(theme = %theme, error = %e, "Tera render-feil (preview)"); StatusCode::INTERNAL_SERVER_ERROR })?; @@ -1316,7 +1333,7 @@ mod tests { let seo = default_seo(); for theme in &["avis", "magasin", "blogg", "tidsskrift"] { - let html = render_article(&tera, theme, &config, &article, "Testsamling", "/pub/test", &seo) + let html = render_article(&tera, theme, &config, &article, "Testsamling", "/pub/test", &seo, false) .unwrap_or_else(|e| panic!("Render feilet for {theme}: {e}")); assert!(html.contains("Testittel"), "Tittel mangler i {theme}"); assert!(html.contains("Testinnhold"), "Innhold mangler i {theme}"); @@ -1346,7 +1363,7 @@ mod tests { json_ld: r#"{"@type":"Article"}"#.to_string(), }; - let html = render_article(&tera, "blogg", &config, &article, "Testpub", "/pub/test", &seo) + let html = render_article(&tera, "blogg", &config, &article, "Testpub", "/pub/test", &seo, false) .expect("Render feilet"); assert!(html.contains("og:title"), "OG-tittel mangler"); @@ -1377,7 +1394,7 @@ mod tests { }; for theme in &["avis", "magasin", "blogg", "tidsskrift"] { - let html = render_index(&tera, theme, &config, &index, "/pub/test") + let html = render_index(&tera, theme, &config, &index, "/pub/test", false) .unwrap_or_else(|e| panic!("Render feilet for {theme}: {e}")); assert!(html.contains("Testforside"), "Tittel mangler i {theme}"); assert!(html.contains("Strøm-artikkel"), "Strøm-artikkel mangler i {theme}"); diff --git a/maskinrommet/src/templates/base.html b/maskinrommet/src/templates/base.html index f777407..1eaa503 100644 --- a/maskinrommet/src/templates/base.html +++ b/maskinrommet/src/templates/base.html @@ -4,6 +4,7 @@ {% block title %}{{ collection_title | default(value="Synops") }}{% endblock %} + {% if has_rss %}{% endif %} {% block seo %}{% endblock %}