2021-03-09 01:32:31 +00:00
|
|
|
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 {
|
2021-04-17 22:18:02 +00:00
|
|
|
Title string
|
|
|
|
Vars map[string]string
|
|
|
|
Query url.Values
|
|
|
|
Session map[interface{}]interface{}
|
|
|
|
Body interface{}
|
|
|
|
Status Status
|
2021-03-09 01:32:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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")
|
2021-03-21 19:58:20 +00:00
|
|
|
w.WriteHeader(status)
|
2021-03-09 01:32:31 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|