Просмотр исходного кода

add delete project and cluster endpoints

Alexander Belanger 4 лет назад
Родитель
Сommit
e3b87d4ef9

+ 41 - 0
api/server/handlers/cluster/delete.go

@@ -0,0 +1,41 @@
+package cluster
+
+import (
+	"net/http"
+
+	"github.com/porter-dev/porter/api/server/authz"
+	"github.com/porter-dev/porter/api/server/handlers"
+	"github.com/porter-dev/porter/api/server/shared"
+	"github.com/porter-dev/porter/api/server/shared/apierrors"
+	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/models"
+)
+
+type ClusterDeleteHandler struct {
+	handlers.PorterHandlerWriter
+	authz.KubernetesAgentGetter
+}
+
+func NewClusterDeleteHandler(
+	config *config.Config,
+	writer shared.ResultWriter,
+) *ClusterDeleteHandler {
+	return &ClusterDeleteHandler{
+		PorterHandlerWriter:   handlers.NewDefaultPorterHandler(config, nil, writer),
+		KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
+	}
+}
+
+func (c *ClusterDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
+
+	err := c.Repo().Cluster().DeleteCluster(cluster)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	c.WriteResult(w, r, cluster.ToClusterType())
+}

+ 38 - 0
api/server/handlers/project/delete.go

@@ -0,0 +1,38 @@
+package project
+
+import (
+	"net/http"
+
+	"github.com/porter-dev/porter/api/server/handlers"
+	"github.com/porter-dev/porter/api/server/shared"
+	"github.com/porter-dev/porter/api/server/shared/apierrors"
+	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/models"
+)
+
+type ProjectDeleteHandler struct {
+	handlers.PorterHandlerWriter
+}
+
+func NewProjectDeleteHandler(
+	config *config.Config,
+	writer shared.ResultWriter,
+) *ProjectDeleteHandler {
+	return &ProjectDeleteHandler{
+		PorterHandlerWriter: handlers.NewDefaultPorterHandler(config, nil, writer),
+	}
+}
+
+func (p *ProjectDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
+
+	proj, err := p.Repo().Project().DeleteProject(proj)
+
+	if err != nil {
+		p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	p.WriteResult(w, r, proj.ToProjectType())
+}

+ 28 - 0
api/server/router/cluster.go

@@ -197,6 +197,34 @@ func getClusterRoutes(
 		Router:   r,
 	})
 
+	// DELETE /api/projects/{project_id}/clusters/{cluster_id} -> project.NewClusterDeleteHandler
+	deleteClusterEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbDelete,
+			Method: types.HTTPVerbDelete,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath,
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+				types.ClusterScope,
+			},
+		},
+	)
+
+	deleteClusterHandler := cluster.NewClusterDeleteHandler(
+		config,
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: deleteClusterEndpoint,
+		Handler:  deleteClusterHandler,
+		Router:   r,
+	})
+
 	// GET /api/projects/{project_id}/clusters/{cluster_id} -> project.NewClusterGetHandler
 	getEndpoint := factory.NewAPIEndpoint(
 		&types.APIRequestMetadata{

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

@@ -83,6 +83,33 @@ func getProjectRoutes(
 		Router:   r,
 	})
 
+	// DELETE /api/projects/{project_id} -> project.NewProjectDeleteHandler
+	deleteEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbDelete,
+			Method: types.HTTPVerbDelete,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath,
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+			},
+		},
+	)
+
+	deleteHandler := project.NewProjectDeleteHandler(
+		config,
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: deleteEndpoint,
+		Handler:  deleteHandler,
+		Router:   r,
+	})
+
 	// GET /api/projects/{project_id}/policy -> project.NewProjectGetPolicyHandler
 	getPolicyEndpoint := factory.NewAPIEndpoint(
 		&types.APIRequestMetadata{

+ 3 - 3
docs/developing/backend-refactor-status.md

@@ -32,9 +32,9 @@
 | <li>- [x] `POST /api/password/reset/initiate`                                                                               | AB          |                 |             | yes              |
 | <li>- [x] `POST /api/password/reset/verify`                                                                                 | AB          |                 |             | yes              |
 | <li>- [x] `POST /api/projects`                                                                                              | AB          |                 |             | yes              |
-| <li>- [ ] `DELETE /api/projects/{project_id}`                                                                               |             |                 |             |                  |
+| <li>- [X] `DELETE /api/projects/{project_id}`                                                                               | AB          |                 |             |                  |
 | <li>- [x] `GET /api/projects/{project_id}`                                                                                  | AB          |                 |             |                  |
-| <li>- [ ] `POST /api/projects/{project_id}/ci/actions/create`                                                               |             |                 |             |                  |
+| <li>- [X] `POST /api/projects/{project_id}/ci/actions/create`                                                               | N/A         |                 |             |                  |
 | <li>- [ ] `POST /api/projects/{project_id}/ci/actions/generate`                                                             |             |                 |             |                  |
 | <li>- [x] `GET /api/projects/{project_id}/clusters`                                                                         | AB          |                 |             | yes              |
 | <li>- [X] `POST /api/projects/{project_id}/clusters`                                                                        | AB          |                 |             |                  |
@@ -43,7 +43,7 @@
 | <li>- [X] `POST /api/projects/{project_id}/clusters/candidates/{candidate_id}/resolve`                                      | AB          |                 |             |                  |
 | <li>- [x] `GET /api/projects/{project_id}/clusters/{cluster_id}`                                                            | AB          |                 |             | yes              |
 | <li>- [X] `POST /api/projects/{project_id}/clusters/{cluster_id}`                                                           | AB          |                 |             |                  |
-| <li>- [ ] `DELETE /api/projects/{project_id}/clusters/{cluster_id}`                                                         |             |                 |             |                  |
+| <li>- [X] `DELETE /api/projects/{project_id}/clusters/{cluster_id}`                                                         | AB          |                 |             |                  |
 | <li>- [X] `GET /api/projects/{project_id}/clusters/{cluster_id}/node/{node_name}`                                           | AB          |                 |             |                  |
 | <li>- [X] `GET /api/projects/{project_id}/clusters/{cluster_id}/nodes`                                                      | AB          |                 |             |                  |
 | <li>- [x] `GET /api/projects/{project_id}/collaborators`                                                                    | AS          |                 |             | yes              |