blob: d9f24d1695d8fc0ebbbd784b0a9b4f173a7e20c3 [file] [log] [blame]
iomodo5e0dc112021-03-25 20:49:55 +04001package rest
2
3import (
4 "net/http"
5
iomodoa19d4792021-03-26 00:27:25 +04006 "github.com/giolekva/pcloud/core/kg/common"
iomodo8e28a6a2021-03-29 00:42:47 +04007 "github.com/giolekva/pcloud/core/kg/log"
iomodo5e0dc112021-03-25 20:49:55 +04008 "github.com/gorilla/mux"
9)
10
11const APIURLSuffix = "/api/v1"
12
iomodoa19d4792021-03-26 00:27:25 +040013type Router struct {
14 App common.AppIface
15 Logger common.LoggerIface
16
iomodo5e0dc112021-03-25 20:49:55 +040017 Root *mux.Router // ''
18 APIRoot *mux.Router // 'api/v1'
19 Users *mux.Router // 'api/v1/users'
20 User *mux.Router // 'api/v1/users/{user_id:[A-Za-z0-9]+}'
21}
22
iomodoa19d4792021-03-26 00:27:25 +040023func NewRouter(root *mux.Router, app common.AppIface, logger common.LoggerIface) *Router {
iomodo5e0dc112021-03-25 20:49:55 +040024 apiRoot := root.PathPrefix(APIURLSuffix).Subrouter()
25 users := apiRoot.PathPrefix("/users").Subrouter()
26 user := apiRoot.PathPrefix("/users/{user_id:[A-Za-z0-9]+}").Subrouter()
27
iomodoa19d4792021-03-26 00:27:25 +040028 routers := &Router{
29 App: app,
30 Logger: logger,
31
iomodo5e0dc112021-03-25 20:49:55 +040032 Root: root,
33 APIRoot: apiRoot,
34 Users: users,
35 User: user,
36 }
iomodoa19d4792021-03-26 00:27:25 +040037
iomodo5e0dc112021-03-25 20:49:55 +040038 root.Handle("/api/v1/{anything:.*}", http.HandlerFunc(http.NotFound))
39 routers.initUsers()
iomodo8e28a6a2021-03-29 00:42:47 +040040 root.Use(routers.loggerMiddleware)
iomodo5e0dc112021-03-25 20:49:55 +040041 return routers
42}
43
iomodoa19d4792021-03-26 00:27:25 +040044func (router *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
45 router.Root.ServeHTTP(w, req)
iomodo5e0dc112021-03-25 20:49:55 +040046}
iomodo8e28a6a2021-03-29 00:42:47 +040047
48func (router *Router) loggerMiddleware(next http.Handler) http.Handler {
49 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
50 router.Logger.Debug(r.Method, log.String("url", r.URL.String()))
51 next.ServeHTTP(w, r)
52 })
53}