Clinical: 잘못 측정한 값 폐기 — Discard(측정 중) + Delete(측정 후 + labdb 서버)
회의 결정: 잘못 측정한 경우를 없앨 방법이 없었음. 두 시점 모두 제공.
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) <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -70,6 +70,22 @@ object LabdbUploader {
|
||||
return if (f.exists()) runCatching { JSONObject(f.readText()).optString("message") }.getOrNull() else null
|
||||
}
|
||||
|
||||
/**
|
||||
* 폴더에 해당하는 labdb 서버 세션 삭제.
|
||||
* labdb_upload.json에 sessionId가 있으면 그것을 사용, 없으면 folderName → sanitizeTestId 변환.
|
||||
* 미등록/미업로드 폴더의 testId도 그대로 호출 → labdb가 404로 응답 → 성공 처리.
|
||||
*/
|
||||
suspend fun deleteSessionForFolder(folder: File): Boolean {
|
||||
val uploadMarker = File(folder, "labdb_upload.json")
|
||||
val testId = if (uploadMarker.exists()) {
|
||||
runCatching { JSONObject(uploadMarker.readText()).optString("sessionId") }
|
||||
.getOrNull()?.takeIf { it.isNotBlank() } ?: sanitizeTestId(folder.name)
|
||||
} else {
|
||||
sanitizeTestId(folder.name)
|
||||
}
|
||||
return if (testId.isNotBlank()) LabdbClient.deleteSession(testId) else true
|
||||
}
|
||||
|
||||
/** measurement.json → labdb payload. 각 cycle = 1 record. */
|
||||
private fun buildPayload(folderName: String, measurement: JSONObject): JSONObject {
|
||||
val meta = measurement.optJSONObject("meta") ?: JSONObject()
|
||||
|
||||
Reference in New Issue
Block a user