diff options
author | Ben Morrison <ben@gbmor.dev> | 2019-05-20 00:53:07 -0400 |
---|---|---|
committer | Ben Morrison <ben@gbmor.dev> | 2019-05-20 02:12:08 -0400 |
commit | efa99ed5253c229c83d8f2d98ee1c08b4383184e (patch) | |
tree | 6c91f0436eff5e31d9be892b6d2f2adfbb3a030c /query.go | |
parent | 747f4fb70ff61d3f8a7bb1bed896a913b0999450 (diff) | |
download | getwtxt-efa99ed5253c229c83d8f2d98ee1c08b4383184e.tar.gz |
endpoint query function added
Diffstat (limited to 'query.go')
-rw-r--r-- | query.go | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/query.go b/query.go new file mode 100644 index 0000000..63deb55 --- /dev/null +++ b/query.go @@ -0,0 +1,83 @@ +package main + +import ( + "log" + "net/http" + "strings" + + "github.com/gorilla/mux" +) + +func apiErrCheck(err error, r *http.Request) { + if err != nil { + uip := getIPFromCtx(r.Context()) + log.Printf("%v :: %v %v :: %v\n", uip, r.Method, r.URL, err) + } +} + +func apiErrCheck500(err error, w http.ResponseWriter, r *http.Request) { + if err != nil { + uip := getIPFromCtx(r.Context()) + log.Printf("%v :: %v %v :: %v\n", uip, r.Method, r.URL, err) + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} + +// apiUserQuery is called via apiEndpointHandler when +// the endpoint is "users" and r.FormValue("q") is not empty. +// It queries the registry cache for users or user URLs +// matching the term supplied via r.FormValue("q") +func apiEndpointQuery(w http.ResponseWriter, r *http.Request) { + query := r.FormValue("q") + urls := r.FormValue("url") + var out []string + var out2 []string + var err error + + vars := mux.Vars(r) + endpoint := vars["endpoint"] + + // Handle user URL queries first, then nickname queries. + // Concatenate both outputs if they're both set. + // Also handle mention queries and status queries. + // If we made it this far and 'default' is matched, + // something went very wrong. + switch endpoint { + case "users": + if urls != "" { + out2, err = twtxtCache.QueryUser(urls) + out = append(out, out2...) + apiErrCheck(err, r) + } + if query != "" { + out2, err = twtxtCache.QueryUser(query) + out = append(out, out2...) + apiErrCheck(err, r) + } + + case "mentions": + out, err = twtxtCache.QueryInStatus(query) + apiErrCheck(err, r) + + case "tweets": + out, err = twtxtCache.QueryInStatus(query) + apiErrCheck(err, r) + + default: + http.Error(w, "500", http.StatusInternalServerError) + } + + // iterate over the output. if there aren't + // explicit newlines, add them. + var data []byte + for _, e := range out { + data = append(data, []byte(e)...) + if !strings.HasSuffix(e, "\n") { + data = append(data, byte('\n')) + } + } + + w.Header().Set("Content-Type", txtutf8) + _, err = w.Write(data) + apiErrCheck500(err, w, r) +} |