Browse Source

update way of clearing users from a project role

Mohammed Nafees 3 years ago
parent
commit
e49378dd19

+ 8 - 1
api/server/handlers/project_role/update.go

@@ -78,7 +78,14 @@ func (c *UpdateProjectRoleHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 		}
 	}
 
-	if len(request.Users) > 0 {
+	if len(request.Users) == 0 {
+		err = c.Repo().ProjectRole().ClearUsersInProjectRole(project.ID, roleUID)
+
+		if err != nil {
+			c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+			return
+		}
+	} else {
 		err = c.Repo().ProjectRole().UpdateUsersInProjectRole(project.ID, roleUID, request.Users)
 
 		if err != nil {

+ 8 - 1
ee/api/server/handlers/invite/update_role.go

@@ -41,6 +41,13 @@ func (c *InviteUpdateRoleHandler) ServeHTTP(w http.ResponseWriter, r *http.Reque
 		return
 	}
 
+	if request.Kind == "" && len(request.RoleUIDs) == 0 {
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(
+			fmt.Errorf("roles cannot be empty"), http.StatusBadRequest,
+		))
+		return
+	}
+
 	changed := false
 
 	if len(request.RoleUIDs) > 0 {
@@ -57,7 +64,7 @@ func (c *InviteUpdateRoleHandler) ServeHTTP(w http.ResponseWriter, r *http.Reque
 		invite.Roles = []byte(strings.Join(request.RoleUIDs, ","))
 
 		changed = true
-	} else if invite.Kind != "" { // legacy invite
+	} else if request.Kind != "" { // legacy invite
 		invite.Kind = request.Kind
 
 		changed = true

+ 20 - 0
internal/repository/gorm/project_role.go

@@ -91,6 +91,26 @@ func (repo *ProjectRoleRepository) UpdateUsersInProjectRole(projectID uint, role
 	return nil
 }
 
+func (repo *ProjectRoleRepository) ClearUsersInProjectRole(projectID uint, roleUID string) error {
+	role := &models.ProjectRole{}
+
+	if err := repo.db.Where("project_id = ? AND unique_id = ?", projectID, roleUID).First(role).Error; err != nil {
+		return err
+	}
+
+	assoc := repo.db.Model(&role).Association("Users")
+
+	if assoc.Error != nil {
+		return assoc.Error
+	}
+
+	if err := assoc.Clear(); err != nil {
+		return err
+	}
+
+	return nil
+}
+
 func (repo *ProjectRoleRepository) UpdateProjectRole(role *models.ProjectRole) (*models.ProjectRole, error) {
 	if err := repo.db.Save(role).Error; err != nil {
 		return nil, err

+ 1 - 0
internal/repository/project_role.go

@@ -9,6 +9,7 @@ type ProjectRoleRepository interface {
 	ListProjectRoles(projectID uint) ([]*models.ProjectRole, error)
 	ListAllRolesForUser(projectID, userID uint) ([]*models.ProjectRole, error)
 	UpdateUsersInProjectRole(projectID uint, roleUID string, userIDs []uint) error
+	ClearUsersInProjectRole(projectID uint, roleUID string) error
 	UpdateProjectRole(role *models.ProjectRole) (*models.ProjectRole, error)
 	DeleteProjectRole(role *models.ProjectRole) (*models.ProjectRole, error)
 }

+ 4 - 0
internal/repository/test/project_role.go

@@ -32,6 +32,10 @@ func (repo *ProjectRoleRepository) UpdateUsersInProjectRole(projectID uint, role
 	panic("not implemented")
 }
 
+func (repo *ProjectRoleRepository) ClearUsersInProjectRole(projectID uint, roleUID string) error {
+	panic("not implemented")
+}
+
 func (repo *ProjectRoleRepository) UpdateProjectRole(role *models.ProjectRole) (*models.ProjectRole, error) {
 	panic("not implemented")
 }