-
Notifications
You must be signed in to change notification settings - Fork 0
/
web.go
82 lines (76 loc) · 1.91 KB
/
web.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package web
import (
"encoding/json"
"net/http"
"strings"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/rs/zerolog"
)
type RouterConfig struct {
// The middlewares to use
// set this not an empty []func(http.Handler) http.Hander{} to not
// use any middleware. Otherwise it uses the defaults
// (see setupDefaults)
Middlewares []func(http.Handler) http.Handler
// NotFoundHandler
NotFoundHandler func(w http.ResponseWriter, r *http.Request)
// MethodNotAllowedHandler
MethodNotAllowedHandler func(w http.ResponseWriter, r *http.Request)
// Log
Log zerolog.Logger
// SwaggerUI
SwaggerUI *SwaggerUIConfig
}
func NewRouter(cfg RouterConfig) (*chi.Mux, error) {
cfg = setupDefaults(cfg)
r := chi.NewRouter()
for i := range cfg.Middlewares {
r.Use(cfg.Middlewares[i])
}
r.NotFound(cfg.NotFoundHandler)
r.MethodNotAllowed(cfg.MethodNotAllowedHandler)
if cfg.SwaggerUI != nil {
h, err := NewSwaggerUI(cfg.SwaggerUI)
if err != nil {
return nil, err
}
sp := cfg.SwaggerUI.Path
if !strings.HasSuffix(sp, "/") {
sp += "/"
}
sp += "*"
r.Handle(sp, http.StripPrefix(cfg.SwaggerUI.Path, h))
}
return r, nil
}
func setupDefaults(cfg RouterConfig) RouterConfig {
if cfg.NotFoundHandler == nil || cfg.MethodNotAllowedHandler == nil {
h := DefaultHandler{}
if cfg.NotFoundHandler == nil {
cfg.NotFoundHandler = h.NotFound
}
if cfg.MethodNotAllowedHandler == nil {
cfg.MethodNotAllowedHandler = h.MethodNotAllowed
}
}
if cfg.Middlewares == nil {
cfg.Middlewares = append(cfg.Middlewares,
middleware.RequestID,
middleware.RealIP,
RequestLogger(cfg.Log),
middleware.Recoverer,
)
}
return cfg
}
func renderJson(w http.ResponseWriter, statusCode int, value any) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(statusCode)
if value == nil {
return
}
if err := json.NewEncoder(w).Encode(value); err != nil {
panic(err)
}
}