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}) }