feat: 의료 어시스턴트 앱 + Home Assistant 임베드 앱 추가

법률 사건관리 앱과 같은 패턴으로 의료 사건(진료기록) 관리 앱 추가
(routes-doctor-cases.ts + doctor-app.html + WOPI 라우트). Home Assistant를
iframe으로 띄우는 얇은 래퍼 앱 추가(ha.applecherry.net, 2026-08-01 통합
완료된 것 URL만 새로 노출). weather_openmeteo의 요청 성형/리포트 포맷팅
로직을 weather-openmeteo-format.ts로 분리(순수함수라 테스트 가능,
2026-07-29 있었던 타임존/롤링윈도우/daily-in-hourly 버그 3건 회귀 방지
테스트 포함) + geocode 재시도 테스트.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
kim
2026-08-07 13:16:01 +09:00
co-authored by Claude Sonnet 5
parent 02247e4ee3
commit d51c40484a
7 changed files with 2331 additions and 1 deletions
+4 -1
View File
@@ -93,6 +93,7 @@ import { registerWriterRoutes } from './routes/routes-writer';
import { registerDentalRoutes } from './routes/routes-dental';
import { registerDetectiveDateRoutes } from './routes/routes-detective-dates';
import { registerLawyerCaseRoutes } from './routes/routes-lawyer-cases';
import { registerDoctorCaseRoutes } from './routes/routes-doctor-cases';
import { caseFilesDir, resolveUploadPath, registerWopiRoutes } from './routes/case-storage';
import {
getConfig,
@@ -4443,6 +4444,8 @@ registerUserRoutes(app, {
registerDetectiveRoutes(app, getSessionUser, isPathInsideDir, CONFIG_DIR_PATH);
registerLawyerCaseRoutes(app, getSessionUser, isPathInsideDir);
registerWopiRoutes(app, '/api/lawyer');
registerDoctorCaseRoutes(app, getSessionUser, isPathInsideDir);
registerWopiRoutes(app, '/api/doctor');
// Redirect legacy top-level HTML routes into /html/ after web-ui reorganization.
@@ -4452,7 +4455,7 @@ const LEGACY_HTML_REDIRECTS = [
'/mind-app.html','/lawyer-app.html','/investor-app.html','/accountant-app.html',
'/detective-app.html','/studio-app.html','/pptx-wizard.html','/traffic-app.html',
'/android-emulator.html','/arduino-emulator.html','/esp32-flasher.html',
'/python-runner.html','/xlsx-viewer.html','/dental-agent.html'
'/python-runner.html','/xlsx-viewer.html','/dental-agent.html','/doctor-app.html'
];
for (const p of LEGACY_HTML_REDIRECTS) {
// req.url retains the original query string (e.g. xlsx-viewer.html?file=...);