-
Notifications
You must be signed in to change notification settings - Fork 0
/
router.go
102 lines (86 loc) · 2.51 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
package server
import (
"context"
"net/http"
"time"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
"github.com/go-chi/jwtauth"
"github.com/iwanhae/Jupynetes/pkg/common"
"github.com/iwanhae/Jupynetes/pkg/config"
"github.com/rs/zerolog/hlog"
"github.com/rs/zerolog/log"
)
var tokenAuth *jwtauth.JWTAuth
var rootQuota common.Quota
//InitRouter Initialize router
func InitRouter(ctx context.Context, c *config.Configs) *chi.Mux {
tokenAuth = jwtauth.New("HS256", []byte(c.SecretKey), nil)
rootQuota = common.Quota{
Instance: c.Quota.Instance,
Cpu: c.Quota.Cpu,
Memory: c.Quota.Memory,
NvidiaGpu: c.Quota.NvidiaGpu,
Storage: c.Quota.Storage,
}
r := chi.NewRouter()
// Default middlwares
r.Use(middleware.Heartbeat("/ping"))
r.Use(middleware.RealIP)
// Logging
r.Use(hlog.NewHandler(log.Logger))
r.Use(hlog.RequestIDHandler("req_id", "Request-Id"))
r.Use(hlog.AccessHandler(func(r *http.Request, status, size int, duration time.Duration) {
log.Ctx(r.Context()).Info().
Str("method", r.Method).
Str("user_agent", r.Header.Get("User-Agent")).
Stringer("url", r.URL).
Int("status", status).
Int("size", size).
Dur("duration", duration).
Msg("")
}))
// Panic Recover
r.Use(middleware.Recoverer)
r.Use(middleware.AllowContentType("application/json"))
// User Application
r.Route("/v1", func(r chi.Router) {
v1 := Server{}
// Without Authorization
r.Group(func(r chi.Router) {
r.Post("/login", v1.LoginUser)
r.Get("/logout", v1.LogoutUser)
})
// User Authorized
r.Group(func(r chi.Router) {
r.Use(jwtauth.Verifier(tokenAuth))
r.Use(AuthorizeUser)
r.Get("/server", v1.GetServerList)
r.Post("/server", v1.CreateServer)
r.Delete("/server/{serverId}", v1.DeleteServer)
r.Get("/server/{serverId}", v1.GetServer)
r.Get("/template", v1.GetTemplateList)
r.Get("/user", v1.GetUserInfo)
r.Post("/user", v1.UpdateUserInfo)
// Admin Authorized
r.Group(func(r chi.Router) {
r.Use(chkAdmin)
r.Post("/admin/quota", v1.AdminSetQuota)
r.Post("/admin/quota/{userId}", v1.AdminSetQuota)
r.Post("/admin/template", v1.AdminCreateTemplate)
r.Get("/admin/user", v1.AdminGetUserList)
})
})
})
log.Info().Msg("initailizing router finished")
return r
}
func chkAdmin(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if GetUser(r.Context()) != "admin" {
send(w, http.StatusUnauthorized, common.GetReason("you are not admin :-("))
return
}
next.ServeHTTP(w, r)
})
}