diff options
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))) } |