diff --git a/services/reports/src/config.rs b/services/reports/src/config.rs --- a/services/reports/src/config.rs +++ b/services/reports/src/config.rs @@ -9,6 +9,16 @@ // environment variable names const ENV_LOCALSTACK_ENDPOINT: &str = "LOCALSTACK_ENDPOINT"; const ENV_BLOB_SERVICE_URL: &str = "BLOB_SERVICE_URL"; +const ENV_PUBLIC_URL: &str = "PUBLIC_URL"; + +/// Base URL on which Reports service is accessible. +/// Used for sending e-mail links. +pub static SERVICE_PUBLIC_URL: Lazy = Lazy::new(|| { + std::env::var(ENV_PUBLIC_URL) + .ok() + .filter(|s| !s.is_empty()) + .unwrap_or_else(|| "http://localhost:50056".to_string()) +}); #[derive(Parser)] #[command(version, about, long_about = None)] diff --git a/services/reports/src/email/template/mod.rs b/services/reports/src/email/template/mod.rs --- a/services/reports/src/email/template/mod.rs +++ b/services/reports/src/email/template/mod.rs @@ -1,9 +1,12 @@ use maud::{html, Markup, Render}; +use tracing::error; -use crate::report_types::*; +use crate::{config::SERVICE_PUBLIC_URL, report_types::*}; mod html_layout; +const MAX_JSON_LINES: usize = 100; + pub fn render_email_for_report( report_input: &ReportInput, report_id: &ReportID, @@ -62,6 +65,8 @@ li { "Time: " b { (time) } } li { "Report ID: " b { (report_id) } } } + (further_actions(report_id, report.report_type.is_error())) + (display_contents(report, report_id)) } } @@ -102,6 +107,52 @@ .unwrap_or("completed") } +fn further_actions( + report_id: &ReportID, + display_download_link: bool, +) -> Markup { + html! { + h3 { "Further actions" } + ul { + li { a href=(report_link(report_id)) { "Open raw report JSON" } } + @if display_download_link { + li { a href={ (report_link(report_id)) "/redux-devtools.json" } { "Redux Devtools import" } } + } + } + } +} + +fn display_contents(report: &ReportInput, report_id: &ReportID) -> Markup { + let pretty = match serde_json::to_string_pretty(&report.report_content) { + Ok(string) => string, + Err(err) => { + error!("Failed to render report JSON: {err}"); + return html! { pre { "ERROR: Failed to render JSON" } }; + } + }; + + let content: String = pretty + .split('\n') + .take(MAX_JSON_LINES) + .collect::>() + .join("\n"); + + html! { + h3 { "Report contents" } + em { + "The content is truncated to " (MAX_JSON_LINES) " lines. To view more, " + a href=(report_link(report_id)) { "open full report" } + "." + } + pre { (content) } + } +} + +fn report_link(id: &ReportID) -> String { + let base_url = SERVICE_PUBLIC_URL.as_str(); + format!("{base_url}/reports/{}", id.as_str()) +} + impl Render for PlatformDetails { fn render(&self) -> Markup { let code_version = self