Forráskód Böngészése

add router logic for attaching middleware

Alexander Belanger 4 éve
szülő
commit
a72755f612

+ 51 - 0
api/server/router/base.go

@@ -0,0 +1,51 @@
+package router
+
+import (
+	"github.com/go-chi/chi"
+	"github.com/porter-dev/porter/api/server/handlers/user"
+	"github.com/porter-dev/porter/api/server/shared"
+	"github.com/porter-dev/porter/api/types"
+)
+
+func NewBaseRegisterer(children ...*Registerer) *Registerer {
+	return &Registerer{
+		GetRoutes: GetBaseRoutes,
+		Children:  children,
+	}
+}
+
+func GetBaseRoutes(
+	r chi.Router,
+	config *shared.Config,
+	basePath *types.Path,
+	factory shared.APIEndpointFactory,
+	children ...*Registerer,
+) []*Route {
+	routes := make([]*Route, 0)
+
+	// POST /api/users -> user.NewUserCreateHandler
+	createUserEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbCreate,
+			Method: types.HTTPVerbPost,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: "/users",
+			},
+		},
+	)
+
+	createUserHandler := user.NewUserCreateHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: createUserEndpoint,
+		Handler:  createUserHandler,
+		Router:   r,
+	})
+
+	return routes
+}

+ 4 - 0
api/server/router/project.go

@@ -71,6 +71,10 @@ func getProjectRoutes(
 				Parent:       basePath,
 				RelativePath: relPath,
 			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+			},
 		},
 	)
 

+ 15 - 2
api/server/router/router.go

@@ -14,10 +14,20 @@ func NewAPIRouter(config *shared.Config) *chi.Mux {
 	r := chi.NewRouter()
 
 	endpointFactory := shared.NewAPIObjectEndpointFactory(config)
+	baseRegisterer := NewBaseRegisterer()
 	projRegisterer := NewProjectScopedRegisterer()
 	userRegisterer := NewUserScopedRegisterer(projRegisterer)
 
 	r.Route("/api", func(r chi.Router) {
+		baseRoutes := baseRegisterer.GetRoutes(
+			r,
+			config,
+			&types.Path{
+				RelativePath: "",
+			},
+			endpointFactory,
+		)
+
 		userRoutes := userRegisterer.GetRoutes(
 			r,
 			config,
@@ -28,7 +38,9 @@ func NewAPIRouter(config *shared.Config) *chi.Mux {
 			userRegisterer.Children...,
 		)
 
-		registerRoutes(config, userRoutes)
+		routes := append(baseRoutes, userRoutes...)
+
+		registerRoutes(config, routes)
 	})
 
 	return r
@@ -72,7 +84,8 @@ func registerRoutes(config *shared.Config, routes []*Route) {
 				atomicGroup.Use(projFactory.Middleware)
 			}
 		}
-		route.Router.Method(
+
+		atomicGroup.Method(
 			string(route.Endpoint.Metadata.Method),
 			route.Endpoint.Metadata.Path.RelativePath,
 			route.Handler,

+ 2 - 7
api/server/router/user.go

@@ -21,13 +21,6 @@ func GetUserScopedRoutes(
 	factory shared.APIEndpointFactory,
 	children ...*Registerer,
 ) []*Route {
-	// // Create a new "user-scoped" factory which will create a new user-scoped request
-	// // after authentication. Each subsequent http.Handler can lookup the user in context.
-	// authNFactory := authn.NewAuthNFactory(config)
-
-	// // attach middleware to router
-	// r.Use(authNFactory.NewAuthenticated)
-
 	routes := getUserRoutes(r, config, basePath, factory)
 
 	for _, child := range children {
@@ -58,6 +51,7 @@ func getUserRoutes(
 				Parent:       basePath,
 				RelativePath: "/projects",
 			},
+			Scopes: []types.PermissionScope{types.UserScope},
 		},
 	)
 
@@ -82,6 +76,7 @@ func getUserRoutes(
 				Parent:       basePath,
 				RelativePath: "/projects",
 			},
+			Scopes: []types.PermissionScope{types.UserScope},
 		},
 	)