inou/api/api_labs.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})
}