fix(documents): detail view에 raw markdown fetch fallback 추가

A-8 작전 후 사용자 보고: 마크다운 전체보기에서 "텍스트 추출 대기 중"
fallback이 뜨는 문서가 있음.

원인: split view의 DocumentViewer는 extracted_text 없으면 원본 .md
파일을 fetch해서 보여주는데, detail view (routes/documents/[id]/+page.svelte)
는 fetch fallback이 없어 즉시 fallback 메시지로 떨어짐. 두 view의 동작
불일치가 A-8 작업 중 사용자 시각 검증 과정에서 드러남.

A-8 회귀 아님 — 이 페이지는 routes 잔존 그룹(36 hits)이라 A-8 batch에서
한 줄도 변경 안 됨 (git diff fcce764..c294df5로 검증).

해결: DocumentViewer와 동일한 fetch fallback 로직을 detail view에도 추가.
fallback 우선순위:
  1. doc.extracted_text 있으면 사용
  2. 없으면 raw markdown fetch 시도
  3. 둘 다 없으면 "*텍스트 추출 대기 중*" 메시지

scope:
- script onMount: vt가 markdown/hwp-markdown이고 extracted_text 없으면
  /api/documents/{id}/file fetch
- template: renderMd fallback chain에 rawMarkdown 추가

routes 색상 토큰 swap (이 페이지의 36 hits)은 별도 이슈 — Phase D에서
정식 처리. 본 hotfix는 콘텐츠 표시 문제만 해결.
This commit is contained in:
Hyungi Ahn
2026-04-07 12:55:59 +09:00
parent c294df5987
commit a2941487fe

View File

@@ -20,12 +20,22 @@
let doc = $state(null);
let loading = $state(true);
let error = $state(null); // 'not_found' | 'network' | null
let rawMarkdown = $state(''); // hotfix: extracted_text 없을 때 원본 fetch fallback
let docId = $derived($page.params.id);
onMount(async () => {
try {
doc = await api(`/documents/${docId}`);
// hotfix: markdown 계열인데 extracted_text 없으면 원본 .md 파일 직접 가져오기
// (split view의 DocumentViewer와 동일한 동작 — A-8 후 보고된 fallback 표시 문제 해결)
const vt = doc.source_channel === 'news' ? 'article' : getViewerType(doc.file_format);
if ((vt === 'markdown' || vt === 'hwp-markdown') && !doc.extracted_text) {
try {
const resp = await fetch(`/api/documents/${docId}/file?token=${getAccessToken()}`);
if (resp.ok) rawMarkdown = await resp.text();
} catch (e) { rawMarkdown = ''; }
}
} catch (err) {
error = err?.status === 404 ? 'not_found' : 'network';
} finally {
@@ -73,7 +83,7 @@
<div class="lg:col-span-2 bg-[var(--surface)] rounded-xl border border-[var(--border)] p-6 min-h-[500px]">
{#if viewerType === 'markdown' || viewerType === 'hwp-markdown'}
<div class="prose prose-invert prose-sm max-w-none">
{@html renderMd(doc.extracted_text || '*텍스트 추출 대기 중*')}
{@html renderMd(doc.extracted_text || rawMarkdown || '*텍스트 추출 대기 중*')}
</div>
{:else if viewerType === 'pdf'}
<iframe