90 lines
4.2 KiB
Markdown
90 lines
4.2 KiB
Markdown
# 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) |
|