diff --git a/src/api/workflows.rs b/src/api/workflows.rs index 1cbd8d6..ad47203 100644 --- a/src/api/workflows.rs +++ b/src/api/workflows.rs @@ -16,6 +16,7 @@ use super::{ApiResult, db_err}; #[derive(serde::Serialize)] struct ReportResponse { + project_id: String, report: String, } @@ -181,11 +182,25 @@ async fn get_report( .await .map_err(db_err)?; - match wf { - Some(w) if !w.report.is_empty() => Ok(Json(ReportResponse { report: w.report })), - Some(_) => Err((StatusCode::NOT_FOUND, "Report not yet generated").into_response()), - None => Err((StatusCode::NOT_FOUND, "Workflow not found").into_response()), + let wf = match wf { + Some(w) => w, + None => return Err((StatusCode::NOT_FOUND, "Workflow not found").into_response()), + }; + + // Read report.md from workspace + let workspace_root = if std::path::Path::new("/app/data/workspaces").is_dir() { + "/app/data/workspaces" + } else { + "data/workspaces" + }; + let report_path = format!("{}/{}/report.md", workspace_root, wf.project_id); + let report = tokio::fs::read_to_string(&report_path).await.unwrap_or_default(); + + if report.is_empty() { + return Err((StatusCode::NOT_FOUND, "report.md not found").into_response()); } + + Ok(Json(ReportResponse { project_id: wf.project_id, report })) } async fn get_plan( diff --git a/web/src/api.ts b/web/src/api.ts index 1b66d07..92197d8 100644 --- a/web/src/api.ts +++ b/web/src/api.ts @@ -67,7 +67,7 @@ export const api = { }), getReport: (workflowId: string) => - request<{ report: string }>(`/workflows/${workflowId}/report`), + request<{ project_id: string; report: string }>(`/workflows/${workflowId}/report`), listPlanSteps: (workflowId: string) => request(`/workflows/${workflowId}/plan`), diff --git a/web/src/components/AppLayout.vue b/web/src/components/AppLayout.vue index fb62bd4..4460d7c 100644 --- a/web/src/components/AppLayout.vue +++ b/web/src/components/AppLayout.vue @@ -289,7 +289,7 @@ function goHome() {