summaryrefslogtreecommitdiff
path: root/system/api/server.go
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2016-09-24 02:06:54 -0700
committerSteve Manuel <nilslice@gmail.com>2016-09-24 02:06:54 -0700
commitafe2ad4d1ead83b6d437fef57cc0feecaa5ac0ce (patch)
tree606e6e73fba227988b826503e66eddd333d9474a /system/api/server.go
parentf2039ffbfb5a978ddcf671a099eb125bfd180fd4 (diff)
creating JSON API server, initial version working
Diffstat (limited to 'system/api/server.go')
-rw-r--r--system/api/server.go135
1 files changed, 135 insertions, 0 deletions
diff --git a/system/api/server.go b/system/api/server.go
new file mode 100644
index 0000000..5fa0bfc
--- /dev/null
+++ b/system/api/server.go
@@ -0,0 +1,135 @@
+package api
+
+import (
+ "bytes"
+ "encoding/json"
+ "log"
+ "net/http"
+
+ "github.com/nilslice/cms/content"
+ "github.com/nilslice/cms/system/db"
+)
+
+func init() {
+ http.HandleFunc("/api/types", func(res http.ResponseWriter, req *http.Request) {
+ var types = []string{}
+ for t := range content.Types {
+ types = append(types, string(t))
+ }
+
+ j, err := toJSON(types)
+ if err != nil {
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ res.Header().Set("Content-Type", "application/json")
+ res.Write(j)
+ })
+
+ http.HandleFunc("/api/posts", func(res http.ResponseWriter, req *http.Request) {
+ q := req.URL.Query()
+ t := q.Get("type")
+ // TODO: implement pagination
+ // num := q.Get("num")
+ // page := q.Get("page")
+
+ if t == "" {
+ res.WriteHeader(http.StatusBadRequest)
+ return
+ }
+
+ posts := db.GetAll(t)
+ var all = []json.RawMessage{}
+ for _, post := range posts {
+ all = append(all, post)
+ }
+
+ j, err := fmtJSON(all...)
+ if err != nil {
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ res.Header().Set("Content-Type", "application/json")
+ res.Write(j)
+ })
+
+ http.HandleFunc("/api/post", func(res http.ResponseWriter, req *http.Request) {
+ q := req.URL.Query()
+ id := q.Get("id")
+ t := q.Get("type")
+
+ if t == "" || id == "" {
+ res.WriteHeader(http.StatusBadRequest)
+ return
+ }
+
+ post, err := db.Get(t + ":" + id)
+ if err != nil {
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ j, err := fmtJSON(json.RawMessage(post))
+ if err != nil {
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ res.Header().Set("Content-Type", "application/json")
+ res.Write(j)
+ })
+
+}
+
+func fmtJSON(data ...json.RawMessage) ([]byte, error) {
+ var msg = []json.RawMessage{}
+ for _, d := range data {
+ msg = append(msg, d)
+ }
+
+ resp := map[string][]json.RawMessage{
+ "data": msg,
+ }
+
+ var buf = &bytes.Buffer{}
+ enc := json.NewEncoder(buf)
+ err := enc.Encode(resp)
+ if err != nil {
+ log.Println("Failed to encode data to JSON:", err)
+ return nil, err
+ }
+
+ return buf.Bytes(), nil
+}
+
+func toJSON(data []string) ([]byte, error) {
+ var buf = &bytes.Buffer{}
+ enc := json.NewEncoder(buf)
+ resp := map[string][]string{
+ "data": data,
+ }
+
+ err := enc.Encode(resp)
+ if err != nil {
+ log.Println("Failed to encode data to JSON:", err)
+ return nil, err
+ }
+
+ return buf.Bytes(), nil
+}
+
+func wrapJSON(json []byte) []byte {
+ var buf = &bytes.Buffer{}
+ buf.Write([]byte("{data:"))
+ buf.Write(json)
+ buf.Write([]byte("}"))
+
+ return buf.Bytes()
+}
+
+// Run start the JSON API
+func Run(port string) {
+ log.Fatal(http.ListenAndServe(":"+port, nil))
+}