Refactor server: use render func for templates

This commit is contained in:
bronku 2025-03-22 23:46:33 +01:00
parent ca4e448f82
commit a7bd1478bf
6 changed files with 60 additions and 39 deletions

13
server/errors.go Normal file
View file

@ -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())
}
}

5
server/fetcher.go Normal file
View file

@ -0,0 +1,5 @@
package server
import "net/http"
type fetcher func(r *http.Request) (any, error)

View file

@ -1,57 +1,44 @@
package server package server
import ( import (
"fmt"
"net/http" "net/http"
"strconv" "strconv"
"strings" "strings"
"time"
"github.com/Bronku/iroon/store" "github.com/Bronku/iroon/store"
) )
func (h *Server) index(w http.ResponseWriter, r *http.Request) { func (h *Server) index(r *http.Request) (any, error) {
w.Header().Set("content-type", "text/html") return h.s.GetOrders()
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) { func (h *Server) order(r *http.Request) (any, error) {
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 { type formData struct {
Order store.Order Order store.Order
Catalogue []store.Cake Catalogue []store.Cake
} }
var err error
var data formData
cakes, err := h.s.GetCakes() data.Catalogue, err = h.s.GetCakes()
if err != nil { if err != nil {
fmt.Fprint(w, "server side error getting available cakes: ", err) return nil, err
return
} }
data := formData{o, cakes}
//fmt.Println(data)
w.Header().Set("content-type", "text/html") url := strings.Split(r.URL.String(), "/")
err = h.tmpl.ExecuteTemplate(w, "order.html", data) if len(url) < 3 || url[2] == "" {
if err != nil { return data, nil
fmt.Println("error executing the template: ", err)
} }
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
} }

View file

@ -31,8 +31,8 @@ func (h *Server) openStore() error {
func (h *Server) loadHandler() { func (h *Server) loadHandler() {
mux := http.NewServeMux() mux := http.NewServeMux()
mux.HandleFunc("GET /order/", h.getOrder) mux.HandleFunc("GET /order/", h.render(h.order, "order.html"))
mux.HandleFunc("GET /", h.index) mux.HandleFunc("GET /", h.render(h.index, "index.html"))
mux.HandleFunc("POST /order/", h.postOrder) mux.HandleFunc("POST /order/", h.postOrder)
h.Handler = mux h.Handler = mux

View file

@ -3,6 +3,7 @@ package server
import ( import (
"embed" "embed"
"html/template" "html/template"
"net/http"
) )
//go:embed templates/* //go:embed templates/*
@ -13,3 +14,18 @@ func (h *Server) loadTemplates() error {
h.tmpl, err = template.ParseFS(templates, "templates/*") h.tmpl, err = template.ParseFS(templates, "templates/*")
return err 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)
}
}
}

View file

@ -76,7 +76,7 @@ func (s *Store) GetCakes() ([]Cake, error) {
func (s *Store) SaveCake(newCake Cake) (int, error) { func (s *Store) SaveCake(newCake Cake) (int, error) {
query := "insert into cake(name, price) values (?, ?) returning id;" 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 = "update cake set name = ? , price = ? where id = "
query += strconv.Itoa(newCake.ID) + " returning 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) { 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;" 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 = "update customer_order set name = ?, surname = ?, phone = ?, location = ?, order_date = ?, delivery_date = ?, status = ?, paid = ? where id = "
query += strconv.Itoa(newOrder.ID) + " returning id;" query += strconv.Itoa(newOrder.ID) + " returning id;"
} }