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