delete_collaborator.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package project
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "github.com/porter-dev/porter/api/server/shared/apierrors"
  7. "github.com/porter-dev/porter/api/server/shared/requestutils"
  8. "gorm.io/gorm"
  9. "github.com/porter-dev/porter/api/server/handlers"
  10. "github.com/porter-dev/porter/api/server/shared"
  11. "github.com/porter-dev/porter/api/server/shared/config"
  12. "github.com/porter-dev/porter/api/types"
  13. "github.com/porter-dev/porter/internal/models"
  14. )
  15. type DeleteCollaboratorHandler struct {
  16. handlers.PorterHandlerReadWriter
  17. }
  18. func NewDeleteCollaboratorHandler(
  19. config *config.Config,
  20. decoderValidator shared.RequestDecoderValidator,
  21. writer shared.ResultWriter,
  22. ) *DeleteCollaboratorHandler {
  23. return &DeleteCollaboratorHandler{
  24. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  25. }
  26. }
  27. func (p *DeleteCollaboratorHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  28. proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
  29. userID, reqErr := requestutils.GetURLParamUint(r, "user_id")
  30. if reqErr != nil {
  31. p.HandleAPIError(w, r, reqErr)
  32. return
  33. }
  34. // check for valid user ID
  35. _, err := p.Repo().User().ReadUser(userID)
  36. if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
  37. p.HandleAPIError(w, r, apierrors.NewErrNotFound(fmt.Errorf("user not found")))
  38. return
  39. } else if err != nil {
  40. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  41. return
  42. }
  43. userRoles, err := p.Repo().ProjectRole().ListAllRolesForUser(proj.ID, userID)
  44. if err != nil {
  45. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  46. return
  47. }
  48. if len(userRoles) == 0 {
  49. p.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(
  50. fmt.Errorf("user is not a collaborator in this project"), http.StatusBadRequest,
  51. ))
  52. return
  53. }
  54. for _, role := range userRoles {
  55. userIDs := role.GetUserIDs()
  56. var newUserIDs []uint
  57. for _, id := range userIDs {
  58. if id != userID {
  59. newUserIDs = append(newUserIDs, id)
  60. }
  61. }
  62. err = p.Repo().ProjectRole().UpdateUsersInProjectRole(proj.ID, role.UniqueID, newUserIDs)
  63. if err != nil {
  64. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  65. return
  66. }
  67. }
  68. }