package routes import ( "html/template" "net/http" "strconv" db "github.com/innocuous-symmetry/moving-mgmt/db" "github.com/jritsema/gotoolbox/web" ) type ItemActions struct { Get func(r *http.Request) *web.Response GetAll func(r *http.Request) *web.Response Edit func(r *http.Request) *web.Response Delete func(r *http.Request) *web.Response Save func(r *http.Request) *web.Response Post func(r *http.Request) *web.Response Add func(r *http.Request) *web.Response } func Items(_html *template.Template) *ItemActions { html = _html return &ItemActions{ Get: Get, GetAll: GetAllItems, Edit: EditItem, Delete: Delete, Save: Put, Post: Post, Add: Add, } } func Get(r *http.Request) *web.Response { _, count := web.PathLast(r) if count == 1 { return GetAllItems(r) } else { return GetItemByID(r) } } func GetAllItems(_ *http.Request) *web.Response { result, err := db.GetAllItems() if err != nil { panic(err) } return web.HTML( http.StatusOK, html, "items/entity-list.html", result, nil, ) } func EditItem(r *http.Request) *web.Response { idFromPath, _ := web.PathLast(r) id, err := strconv.ParseInt(idFromPath, 10, 64) if err != nil { return web.Error(http.StatusBadRequest, err, nil) } result, err := db.GetItemByID(int(id)) if err != nil { return web.Error(http.StatusInternalServerError, err, nil) } return web.HTML( http.StatusOK, html, "items/entity-edit.html", result, nil, ) } func GetItemByID(r *http.Request) *web.Response { idFromPath, _ := web.PathLast(r) id, err := strconv.ParseInt(idFromPath, 10, 64) if err != nil { return web.Error(http.StatusBadRequest, err, nil) } result, err := db.GetItemByID(int(id)) if err != nil { return web.Error(http.StatusInternalServerError, err, nil) } return web.HTML( http.StatusOK, html, "items/entity-row.html", result, nil, ) } func Put(r *http.Request) *web.Response { id, _ := web.PathLast(r) if err := r.ParseForm(); err != nil { return web.Error(http.StatusBadRequest, err, nil) } if r.Form.Get("category") == "" { panic(r.Form.Get("")) } if r.Form.Get("stage") == "" { panic(r.Form.Get("")) } name := r.Form.Get("name") stage := r.Form.Get("stage") category := r.Form.Get("category") description := r.Form.Get("description") notes := r.Form.Get("notes") // id := r.Form.Get("id") item := db.Item{ ID: func() int { idInt, err := strconv.ParseInt(id, 10, 64) if err != nil { return -1 } return int(idInt) }(), Name: name, Description: &description, Notes: ¬es, Stage: func() db.PackingStage { stageInt, _ := strconv.Atoi(stage) return db.PackingStage(stageInt) }(), Category: func() db.Category { categoryInt, _ := strconv.Atoi(category) return db.Category(categoryInt) }(), } if _, err := db.PutItem(item); err != nil { return web.Error(http.StatusInternalServerError, err, nil) } return web.HTML( http.StatusOK, html, "items/entity-row.html", item, nil, ) } func Post(r *http.Request) *web.Response { err := r.ParseForm() if err != nil { return web.Error(http.StatusBadRequest, err, nil) } name := r.Form.Get("name") stage := r.Form.Get("stage") category := r.Form.Get("category") description := r.Form.Get("description") notes := r.Form.Get("notes") item := db.Item{ Name: name, Description: &description, Notes: ¬es, Stage: func() db.PackingStage { stageInt, _ := strconv.Atoi(stage) return db.PackingStage(stageInt) }(), Category: func() db.Category { categoryInt, _ := strconv.Atoi(category) return db.Category(categoryInt) }(), } _, err = db.PostItem(item) if err != nil { return web.Error(http.StatusInternalServerError, err, nil) } return web.HTML( http.StatusOK, html, "items/entity-add-success.html", item, nil, ) } func Add(r *http.Request) *web.Response { return web.HTML( http.StatusOK, html, "items/items/entity-add.html", nil, nil, ) } func Delete(r *http.Request) *web.Response { idFromPath, _ := web.PathLast(r) id, err := strconv.ParseInt(idFromPath, 10, 64) if err != nil { return web.Error(http.StatusBadRequest, err, nil) } _, err = db.DeleteItem(int(id)) if err != nil { return web.Error(http.StatusInternalServerError, err, nil) } return web.HTML( http.StatusOK, html, "items/entity-row.html", nil, nil, ) }