From ca4e448f820c251cf15e0cfc312b7c45fc0425c6 Mon Sep 17 00:00:00 2001 From: bronku Date: Sat, 22 Mar 2025 22:35:47 +0100 Subject: [PATCH] Refactor handler to server package --- TODO.md | 2 +- main.go | 4 +- router/handler.go | 186 ---------------------- server/get.go | 57 +++++++ server/post.go | 82 ++++++++++ server/server.go | 58 +++++++ server/template.go | 15 ++ index.html => server/templates/index.html | 0 order.html => server/templates/order.html | 0 9 files changed, 215 insertions(+), 189 deletions(-) delete mode 100644 router/handler.go create mode 100644 server/get.go create mode 100644 server/post.go create mode 100644 server/server.go create mode 100644 server/template.go rename index.html => server/templates/index.html (100%) rename order.html => server/templates/order.html (100%) diff --git a/TODO.md b/TODO.md index 6fdb8d0..bba4f20 100644 --- a/TODO.md +++ b/TODO.md @@ -126,7 +126,7 @@ - [ ] Integration Tests - [ ] File structure - [ ] Embed templates -- [ ] Single init function for handler +- [x] Single init function for handler ## Future Considerations diff --git a/main.go b/main.go index cc45899..7e090a7 100644 --- a/main.go +++ b/main.go @@ -6,11 +6,11 @@ import ( "github.com/Bronku/iroon/auth" "github.com/Bronku/iroon/logging" - "github.com/Bronku/iroon/router" + "github.com/Bronku/iroon/server" ) func main() { - h, err := router.New() + h, err := server.New() if err != nil { log.Fatal(err) } diff --git a/router/handler.go b/router/handler.go deleted file mode 100644 index 1ab17e4..0000000 --- a/router/handler.go +++ /dev/null @@ -1,186 +0,0 @@ -package router - -import ( - "fmt" - "html/template" - "net/http" - "strconv" - "strings" - "time" - - "github.com/Bronku/iroon/store" -) - -type Server struct { - tmpl *template.Template - s *store.Store - http.Handler -} - -func (h *Server) Close() { - if h.s != nil { - h.s.Close() - } -} - -func (h *Server) openStore() error { - var err error - h.s, err = store.OpenStore("./foo.db") - if err != nil { - h.s.Close() - } - return err -} - -// #todo embed templates, and load them in init function -func (h *Server) loadTemplates() error { - var err error - h.tmpl, err = template.ParseFiles("index.html", "order.html") - return err -} - -func (h *Server) loadHandler() { - mux := http.NewServeMux() - - mux.HandleFunc("GET /order/", h.Form) - mux.HandleFunc("GET /", h.Index) - mux.HandleFunc("POST /", h.AddOrder) - - h.Handler = mux -} - -func New() (*Server, error) { - var server Server - var err error - - err = server.loadTemplates() - if err != nil { - return nil, err - } - - err = server.openStore() - if err != nil { - return nil, err - } - - server.loadHandler() - - return &server, nil -} - -func (h *Server) Form(w http.ResponseWriter, r *http.Request) { - url := strings.Split(r.URL.String(), "/") - o := store.Order{ - ID: -1, - Date: time.Now(), - } - id, err := strconv.Atoi(url[2]) - if err == nil { - newOrder, err := h.s.GetOrder(id) - if err == nil { - o = newOrder - } - } - type formData struct { - Order store.Order - Catalogue []store.Cake - } - - cakes, err := h.s.GetCakes() - if err != nil { - fmt.Fprint(w, "server side error getting available cakes: ", err) - return - } - data := formData{o, cakes} - //fmt.Println(data) - - w.Header().Set("content-type", "text/html") - err = h.tmpl.ExecuteTemplate(w, "order.html", data) - if err != nil { - fmt.Println("error executing the template: ", err) - } -} - -func (h *Server) AddOrder(w http.ResponseWriter, r *http.Request) { - err := r.ParseForm() - if err != nil { - fmt.Println("can't parse the form") - w.WriteHeader(http.StatusBadRequest) - return - } - fmt.Println("received form: ", r.Form) - - var n store.Order - n.ID, err = strconv.Atoi(r.FormValue("id")) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - fmt.Println("can't parse order id: ", err) - return - } - - n.Name = strings.TrimSpace(r.FormValue("name")) - - n.Surname = strings.TrimSpace(r.FormValue("surname")) - - n.Phone = strings.TrimSpace(r.FormValue("phone")) - - n.Location = strings.TrimSpace(r.FormValue("location")) - - n.Date, err = time.Parse("2006-01-02", r.FormValue("date")) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - fmt.Println("can't parse order date: ", err) - return - } - - n.Status = strings.TrimSpace(r.FormValue("status")) - - n.Paid, err = strconv.Atoi(r.FormValue("paid")) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - fmt.Println("can't parse order paid: ", err) - return - } - - n.Accepted = time.Now() - - n.Cakes = make([]store.Cake, 0) - cakes, err := h.s.GetCakes() - if err != nil { - fmt.Fprint(w, "server side error getting available cakes: ", err) - return - } - for _, e := range cakes { - value := r.FormValue(fmt.Sprintf("cake[%d]", e.ID)) - if value == "" { - continue - } - amount, err := strconv.Atoi(value) - e.Amount = amount - if err != nil { - continue - } - n.Cakes = append(n.Cakes, e) - } - - fmt.Println("parsed order: ", n) - - h.s.SaveOrder(n) - - w.Header().Set("content-type", "text/html") - w.WriteHeader(http.StatusAccepted) - w.Write([]byte("accepted back")) -} - -func (h *Server) Index(w http.ResponseWriter, r *http.Request) { - w.Header().Set("content-type", "text/html") - orders, err := h.s.GetOrders() - if err != nil { - fmt.Fprint(w, "server side error getting orders: ", err) - return - } - err = h.tmpl.ExecuteTemplate(w, "index.html", orders) - if err != nil { - fmt.Println("error executing the template: ", err) - } -} diff --git a/server/get.go b/server/get.go new file mode 100644 index 0000000..754110e --- /dev/null +++ b/server/get.go @@ -0,0 +1,57 @@ +package server + +import ( + "fmt" + "net/http" + "strconv" + "strings" + "time" + + "github.com/Bronku/iroon/store" +) + +func (h *Server) index(w http.ResponseWriter, r *http.Request) { + w.Header().Set("content-type", "text/html") + orders, err := h.s.GetOrders() + if err != nil { + fmt.Fprint(w, "server side error getting orders: ", err) + return + } + err = h.tmpl.ExecuteTemplate(w, "index.html", orders) + if err != nil { + fmt.Println("error executing the template: ", err) + } +} + +func (h *Server) getOrder(w http.ResponseWriter, r *http.Request) { + url := strings.Split(r.URL.String(), "/") + o := store.Order{ + ID: -1, + Date: time.Now(), + } + id, err := strconv.Atoi(url[2]) + if err == nil { + newOrder, err := h.s.GetOrder(id) + if err == nil { + o = newOrder + } + } + type formData struct { + Order store.Order + Catalogue []store.Cake + } + + cakes, err := h.s.GetCakes() + if err != nil { + fmt.Fprint(w, "server side error getting available cakes: ", err) + return + } + data := formData{o, cakes} + //fmt.Println(data) + + w.Header().Set("content-type", "text/html") + err = h.tmpl.ExecuteTemplate(w, "order.html", data) + if err != nil { + fmt.Println("error executing the template: ", err) + } +} diff --git a/server/post.go b/server/post.go new file mode 100644 index 0000000..b75f279 --- /dev/null +++ b/server/post.go @@ -0,0 +1,82 @@ +package server + +import ( + "fmt" + "net/http" + "strconv" + "strings" + "time" + + "github.com/Bronku/iroon/store" +) + +func (h *Server) postOrder(w http.ResponseWriter, r *http.Request) { + err := r.ParseForm() + if err != nil { + fmt.Println("can't parse the form") + w.WriteHeader(http.StatusBadRequest) + return + } + fmt.Println("received form: ", r.Form) + + var n store.Order + n.ID, err = strconv.Atoi(r.FormValue("id")) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + fmt.Println("can't parse order id: ", err) + return + } + + n.Name = strings.TrimSpace(r.FormValue("name")) + + n.Surname = strings.TrimSpace(r.FormValue("surname")) + + n.Phone = strings.TrimSpace(r.FormValue("phone")) + + n.Location = strings.TrimSpace(r.FormValue("location")) + + n.Date, err = time.Parse("2006-01-02", r.FormValue("date")) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + fmt.Println("can't parse order date: ", err) + return + } + + n.Status = strings.TrimSpace(r.FormValue("status")) + + n.Paid, err = strconv.Atoi(r.FormValue("paid")) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + fmt.Println("can't parse order paid: ", err) + return + } + + n.Accepted = time.Now() + + n.Cakes = make([]store.Cake, 0) + cakes, err := h.s.GetCakes() + if err != nil { + fmt.Fprint(w, "server side error getting available cakes: ", err) + return + } + for _, e := range cakes { + value := r.FormValue(fmt.Sprintf("cake[%d]", e.ID)) + if value == "" { + continue + } + amount, err := strconv.Atoi(value) + e.Amount = amount + if err != nil { + continue + } + n.Cakes = append(n.Cakes, e) + } + + fmt.Println("parsed order: ", n) + + h.s.SaveOrder(n) + + w.Header().Set("content-type", "text/html") + w.WriteHeader(http.StatusAccepted) + w.Write([]byte("accepted back")) +} diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..c536fd0 --- /dev/null +++ b/server/server.go @@ -0,0 +1,58 @@ +package server + +import ( + "html/template" + "net/http" + + "github.com/Bronku/iroon/store" +) + +type Server struct { + tmpl *template.Template + s *store.Store + http.Handler +} + +func (h *Server) Close() { + if h.s != nil { + h.s.Close() + } +} + +func (h *Server) openStore() error { + var err error + h.s, err = store.OpenStore("./foo.db") + if err != nil { + h.s.Close() + } + return err +} + +func (h *Server) loadHandler() { + mux := http.NewServeMux() + + mux.HandleFunc("GET /order/", h.getOrder) + mux.HandleFunc("GET /", h.index) + mux.HandleFunc("POST /order/", h.postOrder) + + h.Handler = mux +} + +func New() (*Server, error) { + var server Server + var err error + + err = server.loadTemplates() + if err != nil { + return nil, err + } + + err = server.openStore() + if err != nil { + return nil, err + } + + server.loadHandler() + + return &server, nil +} diff --git a/server/template.go b/server/template.go new file mode 100644 index 0000000..e91cd51 --- /dev/null +++ b/server/template.go @@ -0,0 +1,15 @@ +package server + +import ( + "embed" + "html/template" +) + +//go:embed templates/* +var templates embed.FS + +func (h *Server) loadTemplates() error { + var err error + h.tmpl, err = template.ParseFS(templates, "templates/*") + return err +} diff --git a/index.html b/server/templates/index.html similarity index 100% rename from index.html rename to server/templates/index.html diff --git a/order.html b/server/templates/order.html similarity index 100% rename from order.html rename to server/templates/order.html