From 1574d659cdbdd9609777b97ba9f4e7c9dda07a99 Mon Sep 17 00:00:00 2001 From: jjangddu Date: Tue, 9 Jun 2026 09:51:21 +0900 Subject: [PATCH] =?UTF-8?q?Clinical:=20=EC=9E=98=EB=AA=BB=20=EC=B8=A1?= =?UTF-8?q?=EC=A0=95=ED=95=9C=20=EA=B0=92=20=ED=8F=90=EA=B8=B0=20=E2=80=94?= =?UTF-8?q?=20Discard(=EC=B8=A1=EC=A0=95=20=EC=A4=91)=20+=20Delete(?= =?UTF-8?q?=EC=B8=A1=EC=A0=95=20=ED=9B=84=20+=20labdb=20=EC=84=9C=EB=B2=84?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 회의 결정: 잘못 측정한 경우를 없앨 방법이 없었음. 두 시점 모두 제공. ClinicalSessionStore: - discardAndDeleteFolder(): 측정 중 즉시 폐기. endMeasurement 호출 안 하고 currentSession + cyclesBuffer 비우고 폴더 전체 삭제. - deleteFinalizedFolder(): lastFinalizedFolder 로컬 삭제 + reset. LabdbClient.deleteSession(testId): DELETE /api/v1/sessions/{testId} — Cascade로 모든 records 함께 제거. 204/200/404 모두 성공 처리 (404 = 이미 없음, 멱등). 401 → 자격 clear + Reregister, 403 → PendingApproval, 429 → RateLimit. LabdbUploader.deleteSessionForFolder(folder): labdb_upload.json에 sessionId 있으면 그것을, 없으면 sanitizeTestId(폴더명). 미업로드 폴더에 대해서도 안전하게 호출 가능 (404 처리). ClinicalLiveView: - 기존 End Session 단일 버튼 → Discard + End Session 두 버튼 (50/50 Row) - Discard: 빨간 outline. confirm dialog → 폴더 삭제 + ClinicalHome 복귀 - 사이클 진행 중에도 누를 수 있음 (잘못 측정 즉시 인지 시) ClinicalHomeView: - Last saved 카드에 Upload 버튼 옆 (또는 단독) Delete 버튼 추가 - confirm dialog → labdb 서버 DELETE 시도 → 로컬 폴더 삭제 → state reset - 서버 실패해도 로컬은 진행, Toast로 결과 표시 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../services/ClinicalSessionStore.kt | 28 +++++ .../services/labdb/LabdbClient.kt | Bin 9353 -> 10373 bytes .../services/labdb/LabdbUploader.kt | 16 +++ .../ui/views/clinical/ClinicalHomeView.kt | 99 +++++++++++++----- .../ui/views/clinical/ClinicalLiveView.kt | 64 ++++++++--- 5 files changed, 167 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/example/medilightv2android/services/ClinicalSessionStore.kt b/app/src/main/java/com/example/medilightv2android/services/ClinicalSessionStore.kt index 4c56882..c764bde 100644 --- a/app/src/main/java/com/example/medilightv2android/services/ClinicalSessionStore.kt +++ b/app/src/main/java/com/example/medilightv2android/services/ClinicalSessionStore.kt @@ -248,4 +248,32 @@ object ClinicalSessionStore { fun discardMeasurement() { currentSession = null } + + /** + * 측정 중인 세션을 즉시 폐기 + 폴더 완전 삭제 (잘못 측정 인지 시). + * endMeasurement()와 달리 meta.json/measurement.json/labdb 업로드 전부 skip. + * 반환: 삭제된 폴더 경로 (없으면 null). + */ + fun discardAndDeleteFolder(): File? { + val dir = currentLogDir() + currentSession = null + cyclesBuffer.clear() + if (dir != null && dir.exists()) { + dir.deleteRecursively() + } + return dir + } + + /** + * 이미 finalize된 측정 폴더(lastFinalizedFolder)를 삭제. + * labdb 서버 데이터까지 제거하려면 호출자가 LabdbClient.deleteSession()도 별도 호출. + */ + fun deleteFinalizedFolder(): File? { + val dir = lastFinalizedFolder + if (dir != null && dir.exists()) { + dir.deleteRecursively() + } + lastFinalizedFolder = null + return dir + } } diff --git a/app/src/main/java/com/example/medilightv2android/services/labdb/LabdbClient.kt b/app/src/main/java/com/example/medilightv2android/services/labdb/LabdbClient.kt index e287f04ea8fab0381e56d32ca8ebe3f514404eea..1392cd9f38a81af2b99394c8dddf8bfdf683a9d8 100644 GIT binary patch delta 387 zcmeD5Yz^FCC|&=iWyhP=847Qj*1lOVN8wS!6a^PoAJ-691^vW=O#L!L{o>T(;>`TK zV*Top)Z!A)lv+In=fvXV#FW(63+E`jUbW)&vsmb|8Da8tJr>=Ol8)({sIj=Tu z(Bo170WAe10}~Cud18IGbX(5ngSFy&^I>$%DtJp<@Nd<3U8*jy_wsi zsbH({re))+&0F;pObiV5O$?0nUr*lnW^RK*Nk&nAImFb-jshZTDXBTBC8@y>2Wmi^ zXQdEaQk0pOu4$#yibjZ|yN-gAogLhta1W|LOi-Hq zSIkZTU39XWxEUM7!pVJtNme=_U+Dl{XriENr%+N