Ver Fonte

add update role endpoint

Anukul Sangwan há 4 anos atrás
pai
commit
c80ae1e2b6

+ 1 - 2
api/server/handlers/project/list_roles.go

@@ -7,7 +7,6 @@ import (
 	"github.com/porter-dev/porter/api/server/shared"
 	"github.com/porter-dev/porter/api/server/shared/config"
 	"github.com/porter-dev/porter/api/types"
-	"github.com/porter-dev/porter/internal/models"
 )
 
 type ProjectListRolesHandler struct {
@@ -24,7 +23,7 @@ func NewProjectListRolesHandler(
 }
 
 func (p *ProjectListRolesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-	var res types.ListProjectRolesResponse = []string{models.RoleAdmin, models.RoleDeveloper, models.RoleViewer}
+	var res types.ListProjectRolesResponse = []types.RoleKind{types.RoleAdmin, types.RoleDeveloper, types.RoleViewer}
 
 	p.WriteResult(w, r, res)
 }

+ 60 - 0
api/server/handlers/project/update_role.go

@@ -0,0 +1,60 @@
+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 ProjectUpdateRoleHandler struct {
+	handlers.PorterHandlerReadWriter
+}
+
+func NewProjectUpdateRoleHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *ProjectUpdateRoleHandler {
+	return &ProjectUpdateRoleHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+	}
+}
+
+func (p *ProjectUpdateRoleHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
+
+	request := &types.UpdateRoleRequest{}
+
+	ok := p.DecodeAndValidate(w, r, request)
+
+	if !ok {
+		return
+	}
+
+	role, err := p.Repo().Project().ReadProjectRole(proj.ID, request.UserID)
+
+	if err != nil {
+		http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden)
+		return
+	}
+
+	role.Kind = types.RoleKind(request.Kind)
+
+	role, err = p.Repo().Project().UpdateProjectRole(proj.ID, role)
+
+	if err != nil {
+		p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	var res = types.UpdateRoleResponse{
+		Role: role.ToRoleType(),
+	}
+
+	p.WriteResult(w, r, res)
+}

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

@@ -245,6 +245,34 @@ func getProjectRoutes(
 		Router:   r,
 	})
 
+	// GET /api/projects/{project_id}/roles -> project.NewProjectUpdateRoleHandler
+	updateRoleEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbUpdate,
+			Method: types.HTTPVerbPost,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath + "/roles",
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+			},
+		},
+	)
+
+	updateRoleHandler := project.NewProjectUpdateRoleHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: updateRoleEndpoint,
+		Handler:  updateRoleHandler,
+		Router:   r,
+	})
+
 	// GET /api/projects/{project_id}/registries -> registry.NewRegistryListHandler
 	listRegistriesEndpoint := factory.NewAPIEndpoint(
 		&types.APIRequestMetadata{

+ 10 - 1
api/types/project.go

@@ -33,7 +33,7 @@ type ListProjectInfraResponse []*Infra
 
 type GetProjectPolicyResponse []*PolicyDocument
 
-type ListProjectRolesResponse []string
+type ListProjectRolesResponse []RoleKind
 
 type Collaborator struct {
 	ID        uint   `json:"id"`
@@ -44,3 +44,12 @@ type Collaborator struct {
 }
 
 type ListCollaboratorsResponse []*Collaborator
+
+type UpdateRoleRequest struct {
+	UserID uint   `json:"user_id"`
+	Kind   string `json:"kind"`
+}
+
+type UpdateRoleResponse struct {
+	*Role
+}

+ 5 - 2
dashboard/src/main/home/modals/EditInviteOrCollaboratorModal.tsx

@@ -47,8 +47,11 @@ const EditCollaboratorModal = () => {
     try {
       await api.updateCollaborator(
         "<token>",
-        { kind: selectedRole },
-        { project_id, user_id: user.id }
+        {
+          kind: selectedRole,
+          user_id: user.id,
+        },
+        { project_id }
       );
       setStatus("successful");
       refetchCallerData().then(() => {

+ 6 - 6
dashboard/src/shared/api.tsx

@@ -1016,12 +1016,12 @@ const getCollaborators = baseApi<{}, { project_id: number }>(
 );
 
 const updateCollaborator = baseApi<
-  { kind: string },
-  { project_id: number; user_id: number }
->(
-  "POST",
-  ({ project_id, user_id }) => `/api/projects/${project_id}/roles/${user_id}`
-);
+  {
+    kind: string;
+    user_id: number;
+  },
+  { project_id: number }
+>("POST", ({ project_id }) => `/api/projects/${project_id}/roles`);
 
 const removeCollaborator = baseApi<{}, { project_id: number; user_id: number }>(
   "DELETE",

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

@@ -137,7 +137,7 @@
 | <li>- [X] `GET /api/projects/{project_id}/releases/{name}/{revision}/controllers`                                           | AB          | yes             |             |                  |
 | <li>- [X] `GET /api/projects/{project_id}/releases/{name}/{revision}/pods/all`                                              | AB          |                 |             |                  |
 | <li>- [x] `GET /api/projects/{project_id}/roles`                                                                            | AS          |                 |             | yes              |
-| <li>- [ ] `POST /api/projects/{project_id}/roles/{user_id}`                                                                 |             |                 |             |                  |
+| <li>- [x] `POST /api/projects/{project_id}/roles/{user_id}`                                                                 | AS          | yes             |             | yes              |
 | <li>- [ ] `DELETE /api/projects/{project_id}/roles/{user_id}`                                                               |             |                 |             |                  |
 | <li>- [ ] `GET /api/projects/{project_id}/slack_integrations`                                                               |             |                 |             |                  |
 | <li>- [ ] `GET /api/projects/{project_id}/slack_integrations/exists`                                                        |             |                 |             |                  |