feat: base go mkiso
This commit is contained in:
63
internal/handler/print.go
Normal file
63
internal/handler/print.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"mkiso-server/internal/service"
|
||||
)
|
||||
|
||||
// PrintISO handles GET /api/iso/print?accession_number=X
|
||||
// This single endpoint handles both single and multi-accession relay.
|
||||
// If accession_number contains commas, it auto-detects multi mode.
|
||||
// Returns JSON response with relay results.
|
||||
func PrintISO(relaySvc *service.RelayService) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
acc := r.URL.Query().Get("accession_number")
|
||||
if acc == "" {
|
||||
writeJSON(w, http.StatusBadRequest, map[string]string{"error": "missing accession_number"})
|
||||
return
|
||||
}
|
||||
|
||||
accs := parseAccessions(acc)
|
||||
if len(accs) == 0 {
|
||||
writeJSON(w, http.StatusBadRequest, map[string]string{"error": "empty accession_number"})
|
||||
return
|
||||
}
|
||||
|
||||
slog.Info("handling print/relay",
|
||||
"accessions", accs,
|
||||
"mode", map[bool]string{true: "multi", false: "single"}[len(accs) > 1],
|
||||
)
|
||||
|
||||
result, err := relaySvc.RelayToCDPublisher(r.Context(), accs)
|
||||
if err != nil {
|
||||
slog.Error("print ISO relay failed", "accessions", accs, "error", err)
|
||||
status := http.StatusBadGateway
|
||||
msg := "DICOM relay failed"
|
||||
|
||||
if strings.Contains(err.Error(), "no DICOM data") {
|
||||
status = http.StatusNotFound
|
||||
msg = "no DICOM data for accession_number"
|
||||
} else if strings.Contains(err.Error(), "storescu relay failed") {
|
||||
msg = "CD Publisher unreachable"
|
||||
}
|
||||
|
||||
writeJSON(w, status, map[string]string{
|
||||
"error": msg,
|
||||
"detail": err.Error(),
|
||||
"destination": relaySvc.Destination(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
writeJSON(w, http.StatusOK, map[string]interface{}{
|
||||
"status": "ok",
|
||||
"accessions_sent": result.AccessionsSent,
|
||||
"patient_name": result.PatientName,
|
||||
"destination": result.Destination,
|
||||
"files_sent": result.FilesSent,
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user