Refactor routing and middleware architecture
This commit is contained in:
parent
08d41b0348
commit
fb97ba20c0
5 changed files with 62 additions and 51 deletions
12
auth/auth.go
12
auth/auth.go
|
|
@ -17,8 +17,8 @@ type Authenticator struct {
|
|||
sessions map[string]token
|
||||
}
|
||||
|
||||
func New() Authenticator {
|
||||
return Authenticator{sessions: make(map[string]token)}
|
||||
func New() *Authenticator {
|
||||
return &Authenticator{sessions: make(map[string]token)}
|
||||
}
|
||||
|
||||
func (a *Authenticator) login(w http.ResponseWriter, r *http.Request) {
|
||||
|
|
@ -55,8 +55,8 @@ func (a *Authenticator) login(w http.ResponseWriter, r *http.Request) {
|
|||
http.Redirect(w, r, "/", http.StatusFound)
|
||||
}
|
||||
|
||||
func (a *Authenticator) Authenticate(in http.HandlerFunc) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
func (a *Authenticator) Middleware(in http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.URL.String() == "/login" {
|
||||
a.login(w, r)
|
||||
return
|
||||
|
|
@ -73,6 +73,6 @@ func (a *Authenticator) Authenticate(in http.HandlerFunc) http.HandlerFunc {
|
|||
}
|
||||
value.lastAccess = time.Now()
|
||||
a.sessions[c.Value] = value
|
||||
in(w, r)
|
||||
}
|
||||
in.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
16
logging/logger.go
Normal file
16
logging/logger.go
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
package logging
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
func Middleware(in http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
start := time.Now()
|
||||
fmt.Println(r.Method, r.URL.String())
|
||||
in.ServeHTTP(w, r)
|
||||
fmt.Println(r.Method, "finished in", time.Since(start))
|
||||
})
|
||||
}
|
||||
14
main.go
14
main.go
|
|
@ -5,7 +5,7 @@ import (
|
|||
"net/http"
|
||||
|
||||
"github.com/Bronku/iroon/auth"
|
||||
"github.com/Bronku/iroon/middleware"
|
||||
"github.com/Bronku/iroon/logging"
|
||||
"github.com/Bronku/iroon/router"
|
||||
)
|
||||
|
||||
|
|
@ -16,12 +16,8 @@ func main() {
|
|||
}
|
||||
defer h.Close()
|
||||
|
||||
var a auth.Authenticator
|
||||
a = auth.New()
|
||||
|
||||
// #todo: make handler functions private, and create a servemux in router
|
||||
http.HandleFunc("GET /order/", middleware.Logger(a.Authenticate(h.Form)))
|
||||
http.HandleFunc("GET /", middleware.Logger(a.Authenticate(h.Index)))
|
||||
http.HandleFunc("POST /", middleware.Logger(a.Authenticate(h.AddOrder)))
|
||||
http.ListenAndServe(":8080", nil)
|
||||
var handler http.Handler = h
|
||||
handler = logging.Middleware(handler)
|
||||
handler = auth.New().Middleware(handler)
|
||||
log.Fatal(http.ListenAndServe(":8080", handler))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,17 +0,0 @@
|
|||
package middleware
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
func Logger(in http.HandlerFunc) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
start := time.Now()
|
||||
//log := fmt.Sprint(r.Method, " ", r.URL.String())
|
||||
fmt.Println(r.Method, r.URL.String())
|
||||
in(w, r)
|
||||
fmt.Println(r.Method, "finished in", time.Since(start))
|
||||
}
|
||||
}
|
||||
|
|
@ -11,18 +11,19 @@ import (
|
|||
"github.com/Bronku/iroon/store"
|
||||
)
|
||||
|
||||
type Router struct {
|
||||
type Server struct {
|
||||
tmpl *template.Template
|
||||
s *store.Store
|
||||
http.Handler
|
||||
}
|
||||
|
||||
func (h *Router) Close() {
|
||||
func (h *Server) Close() {
|
||||
if h.s != nil {
|
||||
h.s.Close()
|
||||
}
|
||||
}
|
||||
|
||||
func (h *Router) openStore() error {
|
||||
func (h *Server) openStore() error {
|
||||
var err error
|
||||
h.s, err = store.OpenStore("./foo.db")
|
||||
if err != nil {
|
||||
|
|
@ -32,27 +33,42 @@ func (h *Router) openStore() error {
|
|||
}
|
||||
|
||||
// #todo embed templates, and load them in init function
|
||||
func (h *Router) loadTemplates() error {
|
||||
func (h *Server) loadTemplates() error {
|
||||
var err error
|
||||
h.tmpl, err = template.ParseFiles("index.html", "order.html")
|
||||
return err
|
||||
}
|
||||
|
||||
func New() (*Router, error) {
|
||||
var router Router
|
||||
var err error
|
||||
err = router.loadTemplates()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = router.openStore()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &router, nil
|
||||
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 (h *Router) Form(w http.ResponseWriter, r *http.Request) {
|
||||
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,
|
||||
|
|
@ -85,7 +101,7 @@ func (h *Router) Form(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
}
|
||||
|
||||
func (h *Router) AddOrder(w http.ResponseWriter, r *http.Request) {
|
||||
func (h *Server) AddOrder(w http.ResponseWriter, r *http.Request) {
|
||||
err := r.ParseForm()
|
||||
if err != nil {
|
||||
fmt.Println("can't parse the form")
|
||||
|
|
@ -156,7 +172,7 @@ func (h *Router) AddOrder(w http.ResponseWriter, r *http.Request) {
|
|||
w.Write([]byte("accepted <a href='/'>back</a>"))
|
||||
}
|
||||
|
||||
func (h *Router) Index(w http.ResponseWriter, r *http.Request) {
|
||||
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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue