update_stack.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package stack
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/porter-dev/porter/api/server/handlers"
  6. "github.com/porter-dev/porter/api/server/shared"
  7. "github.com/porter-dev/porter/api/server/shared/apierrors"
  8. "github.com/porter-dev/porter/api/server/shared/config"
  9. "github.com/porter-dev/porter/api/types"
  10. "github.com/porter-dev/porter/internal/models"
  11. )
  12. type StackUpdateStack struct {
  13. handlers.PorterHandlerReadWriter
  14. }
  15. func NewStackUpdateStackHandler(
  16. config *config.Config,
  17. reader shared.RequestDecoderValidator,
  18. writer shared.ResultWriter,
  19. ) *StackUpdateStack {
  20. return &StackUpdateStack{
  21. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, reader, writer),
  22. }
  23. }
  24. func (p *StackUpdateStack) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  25. proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
  26. stack, _ := r.Context().Value(types.StackScope).(*models.Stack)
  27. req := &types.UpdateStackRequest{}
  28. if ok := p.DecodeAndValidate(w, r, req); !ok {
  29. return
  30. }
  31. if len(stack.Revisions) == 0 {
  32. p.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(
  33. fmt.Errorf("no stack revisions exist"), http.StatusBadRequest,
  34. ))
  35. return
  36. }
  37. stack, err := p.Repo().Stack().ReadStackByID(proj.ID, stack.ID)
  38. if err != nil {
  39. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  40. return
  41. }
  42. // Update stack name
  43. stack.Name = req.Name
  44. newStack, err := p.Repo().Stack().UpdateStack(stack)
  45. if err != nil {
  46. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  47. return
  48. }
  49. p.WriteResult(w, r, newStack)
  50. }