forked from eraffaelli/Okuru
/
router.go
128 lines (107 loc) 路 2.66 KB
/
router.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package router
import (
"net/http"
"errors"
"github.com/jeanphilippe-mh/Okuru/routes"
log "github.com/sirupsen/logrus"
"io"
"os"
"path/filepath"
"github.com/flosch/pongo2"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"gopkg.in/go-playground/validator.v9"
)
type (
CustomValidator struct {
validator *validator.Validate
}
Renderer struct {
Debug bool
}
)
func (cv *CustomValidator) Validate(i interface{}) error {
return cv.validator.Struct(i)
}
func (r Renderer) Render(w io.Writer, name string, data interface{}, _ echo.Context) error {
var ctx pongo2.Context
var t *pongo2.Template
var err error
ex, err := os.Executable()
if err != nil {
log.Fatal(err)
}
err = pongo2.DefaultLoader.SetBaseDir(filepath.Dir(ex) + "/views")
if err != nil {
log.Fatal(err)
}
if data != nil {
var ok bool
ctx, ok = data.(pongo2.Context)
if !ok {
return errors.New("no pongo2.Context data was passed")
}
}
if r.Debug {
t, err = pongo2.FromFile(name)
} else {
t, err = pongo2.FromCache(name)
}
// Add some static values
ctx["version_number"] = "v0.0.1-beta"
if err != nil {
return err
}
// return t.ExecuteWriter(ctx, w)
result := t.ExecuteWriter(ctx, w)
log.Debug("%+v\n", result)
return result
}
func New() *echo.Echo {
renderer := Renderer{
Debug: true,
}
e := echo.New()
e.Pre(middleware.RemoveTrailingSlash())
e.Renderer = renderer
e.Validator = &CustomValidator{validator: validator.New()}
// Route => Handler
ex, err := os.Executable()
if err != nil {
log.Fatal(err)
}
// Middleware Logger
e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
Format: `{"time":"${time_rfc3339_nano}","remote_ip":"${remote_ip}","host":"${host}",` +
`"method":"${method}","uri":"${uri}","status":${status},"error":"${error}",` +
`"latency_human":"${latency_human}","bytes_in":${bytes_in},` +
`"bytes_out":${bytes_out}` +
`"user_agent":${user_agent}}` + "\n",
}))
// Middleware CORS
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowMethods: []string{echo.GET, echo.HEAD, echo.OPTIONS, echo.POST, echo.DELETE},
}))
// Middleware CSRF
e.Use(middleware.CSRFWithConfig(middleware.CSRFConfig{
TokenLength: 32,
TokenLookup: "form:_csrf",
CookieSecure: true,
CookieHTTPOnly: true,
CookieSameSite: http.SameSiteStrictMode,
}))
// Middleware Static
publicfolder := filepath.Dir(ex) + "/public"
e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
Root: publicfolder,
HTML5: true,
Browse: false,
}))
// Creating groups
apiGroup := e.Group("/api/v1")
fileGroup := e.Group("/file")
routes.Index(e)
routes.Password(apiGroup)
routes.File(fileGroup)
return e
}