diff --git a/server/errors.go b/server/errors.go new file mode 100644 index 0000000..bc85170 --- /dev/null +++ b/server/errors.go @@ -0,0 +1,13 @@ +package server + +import ( + "fmt" + "net/http" +) + +func errorPage(err error, status int) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(status) + fmt.Fprint(w, err.Error()) + } +} diff --git a/server/fetcher.go b/server/fetcher.go new file mode 100644 index 0000000..5d3e1dc --- /dev/null +++ b/server/fetcher.go @@ -0,0 +1,5 @@ +package server + +import "net/http" + +type fetcher func(r *http.Request) (any, error) diff --git a/server/get.go b/server/get.go index 754110e..347e039 100644 --- a/server/get.go +++ b/server/get.go @@ -1,57 +1,44 @@ 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) index(r *http.Request) (any, error) { + return h.s.GetOrders() } -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 - } - } +func (h *Server) order(r *http.Request) (any, error) { type formData struct { Order store.Order Catalogue []store.Cake } + var err error + var data formData - cakes, err := h.s.GetCakes() + data.Catalogue, err = h.s.GetCakes() if err != nil { - fmt.Fprint(w, "server side error getting available cakes: ", err) - return + return nil, err } - 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) + url := strings.Split(r.URL.String(), "/") + if len(url) < 3 || url[2] == "" { + return data, nil } + + id, err := strconv.Atoi(url[2]) + if err != nil { + return nil, err + } + + data.Order, err = h.s.GetOrder(id) + if err != nil { + return nil, err + } + + return data, nil } diff --git a/server/server.go b/server/server.go index c536fd0..b0cd271 100644 --- a/server/server.go +++ b/server/server.go @@ -31,8 +31,8 @@ func (h *Server) openStore() error { func (h *Server) loadHandler() { mux := http.NewServeMux() - mux.HandleFunc("GET /order/", h.getOrder) - mux.HandleFunc("GET /", h.index) + mux.HandleFunc("GET /order/", h.render(h.order, "order.html")) + mux.HandleFunc("GET /", h.render(h.index, "index.html")) mux.HandleFunc("POST /order/", h.postOrder) h.Handler = mux diff --git a/server/template.go b/server/template.go index e91cd51..df7b692 100644 --- a/server/template.go +++ b/server/template.go @@ -3,6 +3,7 @@ package server import ( "embed" "html/template" + "net/http" ) //go:embed templates/* @@ -13,3 +14,18 @@ func (h *Server) loadTemplates() error { h.tmpl, err = template.ParseFS(templates, "templates/*") return err } + +func (s *Server) render(fetch fetcher, templateName string) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("content-type", "text/html") + data, err := fetch(r) + if err != nil { + errorPage(err, http.StatusInternalServerError).ServeHTTP(w, r) + return + } + err = s.tmpl.ExecuteTemplate(w, templateName, data) + if err != nil { + errorPage(err, http.StatusInternalServerError).ServeHTTP(w, r) + } + } +} diff --git a/store/store.go b/store/store.go index 723a1da..4af17ca 100644 --- a/store/store.go +++ b/store/store.go @@ -76,7 +76,7 @@ func (s *Store) GetCakes() ([]Cake, error) { func (s *Store) SaveCake(newCake Cake) (int, error) { query := "insert into cake(name, price) values (?, ?) returning id;" - if newCake.ID != -1 { + if newCake.ID != 0 { query = "update cake set name = ? , price = ? where id = " query += strconv.Itoa(newCake.ID) + " returning id;" } @@ -181,7 +181,7 @@ func (s *Store) GetOrders() ([]Order, error) { func (s *Store) SaveOrder(newOrder Order) (int, error) { query := "insert into customer_order(name, surname, phone, location, order_date, delivery_date, status, paid) values (?, ?, ?, ?, ?, ?, ?, ?) returning id;" - if newOrder.ID != -1 { + if newOrder.ID != 0 { query = "update customer_order set name = ?, surname = ?, phone = ?, location = ?, order_date = ?, delivery_date = ?, status = ?, paid = ? where id = " query += strconv.Itoa(newOrder.ID) + " returning id;" }