Anukul Sangwan 4 лет назад
Родитель
Сommit
4e4b4e5ba0
3 измененных файлов с 71 добавлено и 0 удалено
  1. 42 0
      api/server/handlers/project/get_policy.go
  2. 27 0
      api/server/router/project.go
  3. 2 0
      api/types/project.go

+ 42 - 0
api/server/handlers/project/get_policy.go

@@ -0,0 +1,42 @@
+package project
+
+import (
+	"github.com/porter-dev/porter/api/server/authz/policy"
+	"github.com/porter-dev/porter/api/server/shared/apierrors"
+	"net/http"
+
+	"github.com/porter-dev/porter/api/server/handlers"
+	"github.com/porter-dev/porter/api/server/shared"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/models"
+)
+
+type ProjectGetPolicyHandler struct {
+	handlers.PorterHandlerWriter
+}
+
+func NewProjectGetPolicyHandler(
+	config *shared.Config,
+	writer shared.ResultWriter,
+) *ProjectGetPolicyHandler {
+	return &ProjectGetPolicyHandler{
+		PorterHandlerWriter: handlers.NewDefaultPorterHandler(config, nil, writer),
+	}
+}
+
+func (p *ProjectGetPolicyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	user, _ := r.Context().Value(types.UserScope).(*models.User)
+	proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
+
+	policyDocLoader := policy.NewBasicPolicyDocumentLoader(p.Config().Repo.Project())
+
+	policyDocs, err := policyDocLoader.LoadPolicyDocuments(user.ID, proj.ID)
+
+	if err != nil {
+		p.HandleAPIError(w, apierrors.NewErrInternal(err))
+	}
+
+	var res types.GetProjectPolicyResponse = policyDocs
+
+	p.WriteResult(w, res)
+}

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

@@ -79,6 +79,33 @@ func getProjectRoutes(
 		Router:   r,
 	})
 
+	// GET /api/projects/{project_id}/policy -> project.NewProjectGetPolicyHandler
+	getPolicyEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbGet,
+			Method: types.HTTPVerbGet,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath + "/policy",
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+			},
+		},
+	)
+
+	getPolicyHandler := project.NewProjectGetPolicyHandler(
+		config,
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: getPolicyEndpoint,
+		Handler:  getPolicyHandler,
+		Router:   r,
+	})
+
 	// GET /api/projects/{project_id}/infra -> project.NewListProjectInfraHandler
 	listInfraEndpoint := factory.NewAPIEndpoint(
 		&types.APIRequestMetadata{

+ 2 - 0
api/types/project.go

@@ -30,3 +30,5 @@ type DeleteProjectRequest struct {
 type DeleteProjectResponse Project
 
 type ListProjectInfraResponse []*Infra
+
+type GetProjectPolicyResponse []*PolicyDocument