From a2941487fe9479df95febfb6de3dba00480d846a Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Tue, 7 Apr 2026 12:55:59 +0900 Subject: [PATCH] =?UTF-8?q?fix(documents):=20detail=20view=EC=97=90=20raw?= =?UTF-8?q?=20markdown=20fetch=20fallback=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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는 콘텐츠 표시 문제만 해결. --- frontend/src/routes/documents/[id]/+page.svelte | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/frontend/src/routes/documents/[id]/+page.svelte b/frontend/src/routes/documents/[id]/+page.svelte index c362af3..f23bd5a 100644 --- a/frontend/src/routes/documents/[id]/+page.svelte +++ b/frontend/src/routes/documents/[id]/+page.svelte @@ -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 @@
{#if viewerType === 'markdown' || viewerType === 'hwp-markdown'}
- {@html renderMd(doc.extracted_text || '*텍스트 추출 대기 중*')} + {@html renderMd(doc.extracted_text || rawMarkdown || '*텍스트 추출 대기 중*')}
{:else if viewerType === 'pdf'}