# Pre-Flight Checklist — Before Implementation ## Decisions needed before writing code - [ ] **YAML or JSON config?** - YAML = 1 external dep (`gopkg.in/yaml.v3`), more human-readable - JSON = zero external deps (`encoding/json`), `config.json` instead of `config.yaml` - **Recommendation**: JSON for true stdlib-only. YAML is fine if 1 dep is ok. - [ ] **Patient API availability during dev** - The patient-data API doesn't exist yet (only spec in `docs/patient-api-spec.md`) - Option A: Build a thin PHP stub first (copy the reference impl from the spec) - Option B: Make patient API call optional with graceful degradation in Stage 1 - **Recommendation**: B for Stage 1 (multi-accession ISO falls back to accession-list filename if API unavailable). Build the real API before Stage 2. - [ ] **`send_rimage_multiple.php` single vs multi routing** - The HIS JS calls `send_rimage_multiple.php?accession_number=X` for single AND `send_rimage_multiple.php?accession_number=X,Y,Z` for multi - The Go API has TWO endpoints: `/api/iso/print` (single) and `/api/iso/print-multiple` (multi) - **Problem**: nginx can't distinguish them — same PHP file, same query param name - **Fix**: Merge into one Go endpoint that auto-detects commas: - `GET /api/iso/print?accession_number=X` → single - `GET /api/iso/print?accession_number=X,Y,Z` → comma → multi - Then nginx maps `send_rimage_multiple.php` → `/api/iso/print` only - [ ] **0-file edge case in DICOM fetch** - What if PACS returns success but 0 files? (valid accession, no images) - Current plan doesn't explicitly handle this - **Fix**: After FetchDICOM, check `filesCount > 0`. If 0, return `404 {"error":"no DICOM data"}` before attempting ISO creation. - [ ] **microdicom viewer files path** - Config: `iso.microdicom_path: "/var/www/html/microdicom"` - These files are in `raw/microdicom/` in this project - Must exist on the PACS server at the configured path - If missing, ISO will still work (just no embedded viewer) - [ ] **CD Publisher reachability** - Config: `cd_publisher.host: "172.16.0.120"`, port 104 - May not be reachable from dev environment - storescu will fail with connection refused — handle gracefully - [ ] **Config path** - Hardcode: `config.yaml` in working directory - Or env: `MKISO_CONFIG=/etc/mkiso/config.yaml` - **Recommendation**: env var with fallback to `./config.yaml` ## Files that need to be created (not just spec'd) | File | Status | |------|--------| | `go.mod` | Create with `module mkiso-server` | | `config.example.yaml` | Template from design doc § config.yaml | | `main.go` | Entrypoint | | `internal/config/config.go` | Config loading | | `internal/route/route.go` | Route wiring | | `internal/middleware/auth.go` | API key middleware (Stage 2) | | `internal/handler/health.go` | Health check | | `internal/handler/iso.go` | ISO download handlers | | `internal/handler/print.go` | Print/relay handlers | | `internal/service/dicom.go` | DICOM orchestration | | `internal/service/iso.go` | ISO creation | | `internal/service/relay.go` | CD Publisher relay | | `internal/repo/patient.go` | Patient API client | | `pkg/dicom/command.go` | DICOM binary runner | ## Implementation order (respects dependencies) ``` 1. config.go (no deps) 2. pkg/dicom/command.go (no deps) 3. repo/patient.go (depends on config) 4. service/dicom.go (depends on #2) 5. service/iso.go (depends on #3, #4) 6. service/relay.go (depends on #3, #4) 7. handler/health.go (no deps) 8. handler/iso.go (depends on #5) 9. handler/print.go (depends on #6) 10. route/route.go (depends on #7, #8, #9) 11. middleware/auth.go (depends on config) — Stage 2 12. main.go (depends on #10) ``` ## Known gaps in the plan (addressed above) | Gap | Resolution | |-----|------------| | Nginx regex mapping bug (old `$1` didn't map to Go paths) | Fixed — explicit `location =` blocks with correct `proxy_pass` targets | | `print` vs `print-multiple` routing conflict | Merge into single endpoint with comma detection. Update handler accordingly. | | 0-files from PACS not handled | Check `filesCount > 0` after FetchDICOM, return 404 if empty | | Patient API doesn't exist yet | Graceful degradation in Stage 1 (skip patient name for filename) |