diff options
author | Steve Manuel <nilslice@gmail.com> | 2016-09-24 02:06:54 -0700 |
---|---|---|
committer | Steve Manuel <nilslice@gmail.com> | 2016-09-24 02:06:54 -0700 |
commit | afe2ad4d1ead83b6d437fef57cc0feecaa5ac0ce (patch) | |
tree | 606e6e73fba227988b826503e66eddd333d9474a /system/admin/server.go | |
parent | f2039ffbfb5a978ddcf671a099eb125bfd180fd4 (diff) |
creating JSON API server, initial version working
Diffstat (limited to 'system/admin/server.go')
-rw-r--r-- | system/admin/server.go | 122 |
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) +} |