Files
dicom-iso/todo/pre-flight.md
2026-06-05 08:11:44 +07:00

4.2 KiB

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)