diff options
author | Steve Manuel <nilslice@gmail.com> | 2017-04-11 02:09:28 -0700 |
---|---|---|
committer | Steve Manuel <nilslice@gmail.com> | 2017-04-11 02:09:28 -0700 |
commit | 39ed91df81073489b485fae9a437fdb74954c40b (patch) | |
tree | d4d6edf11c85002dd38cca0f758bc7b47c3a89d6 /system/api/search.go | |
parent | 31ba833f6cf0ac7bce42e8b9b8b44a3020e140b9 (diff) | |
parent | 6c340440a24b6b0b309c0ef3554297e758823f7d (diff) |
Merge branch 'throttle-sort'
Diffstat (limited to 'system/api/search.go')
-rw-r--r-- | system/api/search.go | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/system/api/search.go b/system/api/search.go new file mode 100644 index 0000000..ae6ac1c --- /dev/null +++ b/system/api/search.go @@ -0,0 +1,82 @@ +package api + +import ( + "encoding/json" + "log" + "net/http" + "net/url" + + "github.com/ponzu-cms/ponzu/system/db" + "github.com/ponzu-cms/ponzu/system/item" +) + +func searchContentHandler(res http.ResponseWriter, req *http.Request) { + qs := req.URL.Query() + t := qs.Get("type") + // type must be set, future version may compile multi-type result set + if t == "" { + res.WriteHeader(http.StatusBadRequest) + return + } + + it, ok := item.Types[t] + if !ok { + res.WriteHeader(http.StatusBadRequest) + return + } + + if hide(it(), res, req) { + return + } + + q, err := url.QueryUnescape(qs.Get("q")) + if err != nil { + res.WriteHeader(http.StatusInternalServerError) + return + } + + // q must be set + if q == "" { + res.WriteHeader(http.StatusBadRequest) + return + } + + // execute search for query provided, if no index for type send 404 + matches, err := db.SearchType(t, q) + if err == db.ErrNoSearchIndex { + res.WriteHeader(http.StatusBadRequest) + return + } + if err != nil { + log.Println("[search] Error:", err) + res.WriteHeader(http.StatusInternalServerError) + return + } + + // respond with json formatted results + bb, err := db.ContentMulti(matches) + if err != nil { + log.Println("[search] Error:", err) + res.WriteHeader(http.StatusInternalServerError) + return + } + + var result = []json.RawMessage{} + for i := range bb { + result = append(result, bb[i]) + } + + j, err := fmtJSON(result...) + if err != nil { + res.WriteHeader(http.StatusInternalServerError) + return + } + + j, err = omit(it(), j) + if err != nil { + res.WriteHeader(http.StatusInternalServerError) + return + } + + sendData(res, req, j) +} |