summaryrefslogtreecommitdiff
path: root/system/admin/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/admin/server.go
parentf2039ffbfb5a978ddcf671a099eb125bfd180fd4 (diff)
creating JSON API server, initial version working
Diffstat (limited to 'system/admin/server.go')
-rw-r--r--system/admin/server.go122
1 files changed, 122 insertions, 0 deletions
diff --git a/system/admin/server.go b/system/admin/server.go
new file mode 100644
index 0000000..730561a
--- /dev/null
+++ b/system/admin/server.go
@@ -0,0 +1,122 @@
+package admin
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "net/http"
+
+ "github.com/nilslice/cms/content"
+ "github.com/nilslice/cms/management/editor"
+ "github.com/nilslice/cms/management/manager"
+ "github.com/nilslice/cms/system/db"
+)
+
+func init() {
+ http.HandleFunc("/admin", func(res http.ResponseWriter, req *http.Request) {
+ adminView := Admin(nil)
+
+ res.Header().Set("Content-Type", "text/html")
+ res.Write(adminView)
+ })
+
+ http.HandleFunc("/admin/posts", func(res http.ResponseWriter, req *http.Request) {
+ q := req.URL.Query()
+ t := q.Get("type")
+ if t == "" {
+ res.WriteHeader(http.StatusBadRequest)
+ }
+
+ posts := db.GetAll(t)
+ b := &bytes.Buffer{}
+ p := content.Types[t]().(editor.Editable)
+
+ html := `<a href="/admin/edit?type=` + t + `" class="button">New ` + t + `</a>
+ <ul class="posts">`
+ for i := range posts {
+ json.Unmarshal(posts[i], &p)
+ post := `<li><a href="/admin/edit?type=` +
+ t + `&id=` + fmt.Sprintf("%d", p.ContentID()) +
+ `">` + p.ContentName() + `</a></li>`
+ b.Write([]byte(post))
+ }
+ html = html + b.String()
+
+ adminView := Admin([]byte(html))
+
+ res.Header().Set("Content-Type", "text/html")
+ res.Write(adminView)
+ })
+
+ http.HandleFunc("/admin/edit", func(res http.ResponseWriter, req *http.Request) {
+ switch req.Method {
+ case http.MethodGet:
+ q := req.URL.Query()
+ i := q.Get("id")
+ t := q.Get("type")
+ contentType, ok := content.Types[t]
+ if !ok {
+ fmt.Fprintf(res, content.ErrTypeNotRegistered, t)
+ return
+ }
+ post := contentType()
+
+ if i != "" {
+ data, err := db.Get(t + ":" + i)
+ if err != nil {
+ fmt.Println(err)
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ err = json.Unmarshal(data, post)
+ if err != nil {
+ fmt.Println(err)
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+ } else {
+ post.(editor.Editable).SetContentID(-1)
+ }
+
+ m, err := manager.Manage(post.(editor.Editable), t)
+ adminView := Admin(m)
+ if err != nil {
+ fmt.Println(err)
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+ res.Header().Set("Content-Type", "text/html")
+ res.Write(adminView)
+
+ case http.MethodPost:
+ err := req.ParseForm()
+ if err != nil {
+ fmt.Println(err)
+ res.WriteHeader(http.StatusBadRequest)
+ return
+ }
+
+ cid := req.FormValue("id")
+ t := req.FormValue("type")
+ id, err := db.Set(t+":"+cid, req.PostForm)
+ if err != nil {
+ fmt.Println(err)
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ scheme := req.URL.Scheme
+ host := req.URL.Host
+ path := req.URL.Path
+ sid := fmt.Sprintf("%d", id)
+ desURL := scheme + host + path + "?type=" + t + "&id=" + sid
+ http.Redirect(res, req, desURL, http.StatusFound)
+ }
+ })
+}
+
+// Run starts the Admin system on the port provided
+func Run(port string) {
+ http.ListenAndServe(":"+port, nil)
+}