102 lines
2.3 KiB
Go
102 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"inou/lib"
|
|
)
|
|
|
|
func handleLabTests(w http.ResponseWriter, r *http.Request) {
|
|
ctx := getAccessContextOrFail(w, r)
|
|
if ctx == nil {
|
|
return
|
|
}
|
|
|
|
dossierID := r.URL.Query().Get("dossier")
|
|
if dossierID == "" {
|
|
http.Error(w, "dossier required", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// RBAC: Check read access to dossier
|
|
if !requireDossierAccess(w, ctx, dossierID) {
|
|
return
|
|
}
|
|
|
|
tests, err := lib.EntryTypes(dossierID, lib.CategoryLab)
|
|
if err != nil || len(tests) == 0 {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(map[string]interface{}{"tests": []string{}, "message": "no lab data for this dossier"})
|
|
return
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(map[string]interface{}{"tests": tests})
|
|
}
|
|
|
|
func handleLabResults(w http.ResponseWriter, r *http.Request) {
|
|
ctx := getAccessContextOrFail(w, r)
|
|
if ctx == nil {
|
|
return
|
|
}
|
|
|
|
dossierID := r.URL.Query().Get("dossier")
|
|
namesParam := r.URL.Query().Get("names")
|
|
latestOnly := r.URL.Query().Get("latest") == "true"
|
|
|
|
if dossierID == "" {
|
|
http.Error(w, "dossier required", http.StatusBadRequest)
|
|
return
|
|
}
|
|
if namesParam == "" {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
json.NewEncoder(w).Encode(map[string]string{"error": "names parameter required"})
|
|
return
|
|
}
|
|
|
|
// RBAC: Check read access to dossier
|
|
if !requireDossierAccess(w, ctx, dossierID) {
|
|
return
|
|
}
|
|
names := strings.Split(namesParam, ",")
|
|
|
|
var results []map[string]interface{}
|
|
for _, name := range names {
|
|
testName := strings.TrimSpace(name)
|
|
entries, err := lib.EntryQueryOld(dossierID, lib.CategoryLab, testName)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
if latestOnly && len(entries) > 0 {
|
|
entries = entries[:1]
|
|
}
|
|
|
|
for _, e := range entries {
|
|
result := map[string]interface{}{
|
|
"name": testName,
|
|
"value": e.Value,
|
|
"timestamp": e.Timestamp,
|
|
}
|
|
|
|
// Parse data JSON for additional fields
|
|
if e.Data != "" {
|
|
var data map[string]interface{}
|
|
if json.Unmarshal([]byte(e.Data), &data) == nil {
|
|
for k, v := range data {
|
|
result[k] = v
|
|
}
|
|
}
|
|
}
|
|
|
|
results = append(results, result)
|
|
}
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(map[string]interface{}{"results": results})
|
|
}
|