inou/api/api_genome.go

69 lines
1.4 KiB
Go

package main
import (
"encoding/json"
"net/http"
"strconv"
"strings"
"inou/lib"
)
func handleGenomeQuery(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, "missing dossier", http.StatusBadRequest)
return
}
if !requireDossierAccess(w, ctx, dossierID) {
return
}
// Parse query params into opts
q := r.URL.Query()
var minMag float64
if s := q.Get("min_magnitude"); s != "" {
minMag, _ = strconv.ParseFloat(s, 64)
}
offset := 0
if s := q.Get("offset"); s != "" {
offset, _ = strconv.Atoi(s)
}
limit := 100
if s := q.Get("limit"); s != "" {
limit, _ = strconv.Atoi(s)
}
var rsids []string
if s := q.Get("rsids"); s != "" {
rsids = strings.Split(s, ",")
}
result, err := lib.GenomeQuery(dossierID, lib.GenomeQueryOpts{
Category: q.Get("category"),
Search: q.Get("search"),
Gene: q.Get("gene"),
RSIDs: rsids,
MinMagnitude: minMag,
IncludeHidden: q.Get("include_hidden") == "true",
Sort: q.Get("sort"),
Offset: offset,
Limit: limit,
})
if err != nil {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]interface{}{
"error": err.Error(),
})
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(result)
}