diff options
author | Steve Manuel <nilslice@gmail.com> | 2017-04-07 20:36:07 -0700 |
---|---|---|
committer | Steve Manuel <nilslice@gmail.com> | 2017-04-07 20:36:07 -0700 |
commit | afe92b2bcd3b8e914496006a414ad9b95dba3f0b (patch) | |
tree | 40aca87652d696db10d37eb19c4049528b8d7519 /system/api | |
parent | ba201f640c883d5ed2f3e1f68daff3a7ee4c8b9f (diff) |
add initial implementation of api search handler with full-text search by type
Diffstat (limited to 'system/api')
-rw-r--r-- | system/api/search.go | 82 | ||||
-rw-r--r-- | system/api/server.go | 2 |
2 files changed, 84 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) +} diff --git a/system/api/server.go b/system/api/server.go index c568877..209ddaa 100644 --- a/system/api/server.go +++ b/system/api/server.go @@ -13,4 +13,6 @@ func Run() { http.HandleFunc("/api/content/update", Record(CORS(updateContentHandler))) http.HandleFunc("/api/content/delete", Record(CORS(deleteContentHandler))) + + http.HandleFunc("/api/search", Record(CORS(searchContentHandler))) } |