summaryrefslogtreecommitdiff
path: root/system/api/search.go
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2017-04-07 20:36:07 -0700
committerSteve Manuel <nilslice@gmail.com>2017-04-07 20:36:07 -0700
commitafe92b2bcd3b8e914496006a414ad9b95dba3f0b (patch)
tree40aca87652d696db10d37eb19c4049528b8d7519 /system/api/search.go
parentba201f640c883d5ed2f3e1f68daff3a7ee4c8b9f (diff)
add initial implementation of api search handler with full-text search by type
Diffstat (limited to 'system/api/search.go')
-rw-r--r--system/api/search.go82
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)
+}