From 85fca83bbf3fa775378458ff8ca6fb7e427e5e34 Mon Sep 17 00:00:00 2001 From: jaeyunha Date: Wed, 13 May 2026 10:20:53 -0700 Subject: [PATCH] fix: verify repository wiki reader QA --- crates/api/src/domain/wiki.rs | 20 +++-- crates/api/src/routes/repositories.rs | 6 +- crates/api/tests/repository_wiki_contract.rs | 2 +- prd.json | 2 +- qa-report-summary.json | 38 +++++++- qa-report.json | 92 ++++++++++++++++++++ web/tests/e2e/repository-wiki.spec.ts | 15 ++-- 7 files changed, 154 insertions(+), 21 deletions(-) diff --git a/crates/api/src/domain/wiki.rs b/crates/api/src/domain/wiki.rs index 2fa2d558..e42de234 100644 --- a/crates/api/src/domain/wiki.rs +++ b/crates/api/src/domain/wiki.rs @@ -2241,6 +2241,12 @@ fn revision_from_row( ) -> WikiRevisionSummary { let commit_oid: Option = row.get("commit_oid"); let revision_id: Uuid = row.get("revision_id"); + let href = commit_oid + .as_deref() + .map(|oid| wiki_revision_history_href(repository, page_slug, Some(oid))) + .unwrap_or_else(|| { + wiki_revision_history_href(repository, page_slug, Some(&revision_id.to_string())) + }); WikiRevisionSummary { id: revision_id, author: row.get::, _>("author_id").map(|id| { @@ -2259,11 +2265,7 @@ fn revision_from_row( .map(|oid| oid.chars().take(7).collect::()), commit_oid, created_at: row.get("created_at"), - href: format!( - "{}/_compare/{}", - wiki_page_href(repository, page_slug), - revision_id - ), + href, } } @@ -2346,6 +2348,10 @@ fn wiki_page_href(repository: &Repository, slug: &str) -> String { if slug.eq_ignore_ascii_case("home") { return wiki_home_href(repository); } + wiki_page_scoped_href(repository, slug) +} + +fn wiki_page_scoped_href(repository: &Repository, slug: &str) -> String { format!( "{}/{}", wiki_home_href(repository), @@ -2360,7 +2366,7 @@ fn wiki_history_href( page_size: i64, ) -> String { let base = slug - .map(|slug| format!("{}/_history", wiki_page_href(repository, slug))) + .map(|slug| format!("{}/_history", wiki_page_scoped_href(repository, slug))) .unwrap_or_else(|| format!("{}/_history", wiki_home_href(repository))); let mut params = Vec::new(); if page > 1 { @@ -2384,7 +2390,7 @@ fn wiki_revision_history_href( let revision = commit_oid.unwrap_or("unknown"); format!( "{}/_history/{}", - wiki_page_href(repository, slug), + wiki_page_scoped_href(repository, slug), percent_encode_segment(revision) ) } diff --git a/crates/api/src/routes/repositories.rs b/crates/api/src/routes/repositories.rs index 763b3f6d..81bfd6d0 100644 --- a/crates/api/src/routes/repositories.rs +++ b/crates/api/src/routes/repositories.rs @@ -5692,6 +5692,11 @@ fn map_repository_error(error: RepositoryError) -> (StatusCode, Json error_response( + StatusCode::UNPROCESSABLE_ENTITY, + "validation_failed", + reason, + ), RepositoryError::InvalidVisibility(_) | RepositoryError::InvalidName(_) | RepositoryError::InvalidDescription(_) @@ -5700,7 +5705,6 @@ fn map_repository_error(error: RepositoryError) -> (StatusCode, Json