Refactor case pages into two distinct routes

This commit separates the case detail page into two distinct routes:
`/web/cases/{case_id}` for the main case information and document, and
`/web/cases/{case_id}/recordings` for a dedicated view of audio files
and their transcripts.

This change improves the organization and clarity of the case viewing
experience by segmenting the related but distinct information into their
own UI sections.
This commit is contained in:
2026-04-19 17:02:16 +02:00
parent 76e8ee18e9
commit 3bb2d23adb
5 changed files with 329 additions and 129 deletions
-55
View File
@@ -557,39 +557,6 @@ async fn recovery_skips_completed_analysis() {
);
}
// ---------------------------------------------------------------------
// Document view
// ---------------------------------------------------------------------
#[tokio::test]
async fn document_view_reads_document() {
let config = config_with_llm(unique_tmp("dv"), "http://unused".into());
let case_id = "11111111-1111-1111-1111-111111111111";
let case_dir = seed_case(&config.data_path, "dr_a", case_id);
std::fs::write(case_dir.join("document.md"), "der Inhalt").unwrap();
let app = doctate_server::create_router(config);
let cookie = login(app.clone(), "dr_a").await;
let resp = app
.oneshot(
Request::builder()
.uri(format!("/web/cases/{case_id}/document"))
.header(header::COOKIE, &cookie)
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
assert_eq!(resp.status(), StatusCode::OK);
let body = axum::body::to_bytes(resp.into_body(), usize::MAX)
.await
.unwrap();
let body_str = String::from_utf8(body.to_vec()).unwrap();
assert!(body_str.contains("der Inhalt"), "expected content in body");
assert!(body_str.contains("Dokument"));
}
// ---------------------------------------------------------------------
// Re-analysis path: same handler, version derived from existing documents
// ---------------------------------------------------------------------
@@ -827,28 +794,6 @@ async fn recovery_skips_deleted_cases() {
assert!(rx.try_recv().is_err(), "deleted case must not be enqueued");
}
#[tokio::test]
async fn document_view_without_document_returns_404() {
let config = config_with_llm(unique_tmp("dv2"), "http://unused".into());
let case_id = "11111111-1111-1111-1111-111111111111";
seed_case(&config.data_path, "dr_a", case_id);
let app = doctate_server::create_router(config);
let cookie = login(app.clone(), "dr_a").await;
let resp = app
.oneshot(
Request::builder()
.uri(format!("/web/cases/{case_id}/document"))
.header(header::COOKIE, &cookie)
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
assert_eq!(resp.status(), StatusCode::NOT_FOUND);
}
// ---------------------------------------------------------------------
// Admin-only reset
// ---------------------------------------------------------------------