| iomodo | 5e0dc11 | 2021-03-25 20:49:55 +0400 | [diff] [blame] | 1 | package rest |
| 2 | |
| 3 | import ( |
| 4 | "net/http" |
| 5 | |
| iomodo | a19d479 | 2021-03-26 00:27:25 +0400 | [diff] [blame] | 6 | "github.com/giolekva/pcloud/core/kg/common" |
| iomodo | 8e28a6a | 2021-03-29 00:42:47 +0400 | [diff] [blame] | 7 | "github.com/giolekva/pcloud/core/kg/log" |
| iomodo | 5e0dc11 | 2021-03-25 20:49:55 +0400 | [diff] [blame] | 8 | "github.com/gorilla/mux" |
| 9 | ) |
| 10 | |
| 11 | const APIURLSuffix = "/api/v1" |
| 12 | |
| iomodo | a19d479 | 2021-03-26 00:27:25 +0400 | [diff] [blame] | 13 | type Router struct { |
| 14 | App common.AppIface |
| 15 | Logger common.LoggerIface |
| 16 | |
| iomodo | 5e0dc11 | 2021-03-25 20:49:55 +0400 | [diff] [blame] | 17 | 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 | |
| iomodo | a19d479 | 2021-03-26 00:27:25 +0400 | [diff] [blame] | 23 | func NewRouter(root *mux.Router, app common.AppIface, logger common.LoggerIface) *Router { |
| iomodo | 5e0dc11 | 2021-03-25 20:49:55 +0400 | [diff] [blame] | 24 | apiRoot := root.PathPrefix(APIURLSuffix).Subrouter() |
| 25 | users := apiRoot.PathPrefix("/users").Subrouter() |
| 26 | user := apiRoot.PathPrefix("/users/{user_id:[A-Za-z0-9]+}").Subrouter() |
| 27 | |
| iomodo | a19d479 | 2021-03-26 00:27:25 +0400 | [diff] [blame] | 28 | routers := &Router{ |
| 29 | App: app, |
| 30 | Logger: logger, |
| 31 | |
| iomodo | 5e0dc11 | 2021-03-25 20:49:55 +0400 | [diff] [blame] | 32 | Root: root, |
| 33 | APIRoot: apiRoot, |
| 34 | Users: users, |
| 35 | User: user, |
| 36 | } |
| iomodo | a19d479 | 2021-03-26 00:27:25 +0400 | [diff] [blame] | 37 | |
| iomodo | 5e0dc11 | 2021-03-25 20:49:55 +0400 | [diff] [blame] | 38 | root.Handle("/api/v1/{anything:.*}", http.HandlerFunc(http.NotFound)) |
| 39 | routers.initUsers() |
| iomodo | 8e28a6a | 2021-03-29 00:42:47 +0400 | [diff] [blame] | 40 | root.Use(routers.loggerMiddleware) |
| iomodo | 5e0dc11 | 2021-03-25 20:49:55 +0400 | [diff] [blame] | 41 | return routers |
| 42 | } |
| 43 | |
| iomodo | a19d479 | 2021-03-26 00:27:25 +0400 | [diff] [blame] | 44 | func (router *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { |
| 45 | router.Root.ServeHTTP(w, req) |
| iomodo | 5e0dc11 | 2021-03-25 20:49:55 +0400 | [diff] [blame] | 46 | } |
| iomodo | 8e28a6a | 2021-03-29 00:42:47 +0400 | [diff] [blame] | 47 | |
| 48 | func (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 | } |