This repository has been archived on 2021-08-10. You can view files and clone it, but cannot push or open issues or pull requests.
gtools/router/router.go

89 lines
2.0 KiB
Go

package router
import (
"encoding/json"
"io/fs"
"net/http"
"net/url"
"git.0cd.xyz/michael/gtools/logger"
"git.0cd.xyz/michael/gtools/tpl"
"github.com/gorilla/mux"
)
// Router Configuration
type Router struct {
router *mux.Router
tplopts *tpl.Options
page interface{}
logger *logger.Logger
fsys fs.FS
}
// NewRouter instance of new router
func NewRouter(tplopts *tpl.Options, page interface{}, logger *logger.Logger, fsys fs.FS) *Router {
return &Router{
router: mux.NewRouter(),
tplopts: tplopts,
page: page,
logger: logger,
fsys: fsys,
}
}
// Router returns router
func (re *Router) Router() *mux.Router {
return re.router
}
// Response HTTP Response
type Response struct {
Title string
Vars map[string]string
Query url.Values
Session map[interface{}]interface{}
Body interface{}
Status Status
}
// Status HTTP Status Code
type Status struct {
Status string
StatusCode int
}
// HandlerFunc custom handler function that passes errors
type HandlerFunc func(w http.ResponseWriter, r *http.Request) error
func (f HandlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) {
f(w, r)
}
// Response handles http respondes
func (re *Router) Response(resp *Response, statuscode int) HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) error {
re.logger.AccessMessage(r, statuscode)
if statuscode >= 200 && statuscode <= 299 {
re.RenderTemplate(resp).ServeHTTP(w, r)
return nil
}
return HTTPError(statuscode, nil)
}
}
// Respond responds with data json
func (re *Router) Respond(data interface{}, status int) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
re.logger.AccessMessage(r, status)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(status)
if data != nil {
if err := json.NewEncoder(w).Encode(data); err != nil {
re.logger.Error.Errorf("faield to encode a response: %v", err)
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
}
}
}
}