2
0

update.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package api_contract
  2. import (
  3. "net/http"
  4. "connectrpc.com/connect"
  5. helpers "github.com/porter-dev/api-contracts/generated/go/helpers"
  6. porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
  7. "github.com/porter-dev/porter/api/server/handlers"
  8. "github.com/porter-dev/porter/api/server/shared"
  9. "github.com/porter-dev/porter/api/server/shared/apierrors"
  10. "github.com/porter-dev/porter/api/server/shared/config"
  11. "github.com/porter-dev/porter/api/types"
  12. "github.com/porter-dev/porter/internal/models"
  13. "github.com/porter-dev/porter/internal/telemetry"
  14. )
  15. type APIContractUpdateHandler struct {
  16. handlers.PorterHandlerReadWriter
  17. }
  18. func NewAPIContractUpdateHandler(
  19. config *config.Config,
  20. decoderValidator shared.RequestDecoderValidator,
  21. writer shared.ResultWriter,
  22. ) *APIContractUpdateHandler {
  23. return &APIContractUpdateHandler{
  24. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  25. }
  26. }
  27. // ServeHTTP parses the Porter API contract for validity, and forwards the requests for handling on to another service
  28. // For now, this handling cluster creation only, by inserting a row into the cluster table in order to create an ID for this cluster, as well as stores the raw request JSON for updating later
  29. func (c *APIContractUpdateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  30. ctx, span := telemetry.NewSpan(r.Context(), "serve-update-api-contract")
  31. defer span.End()
  32. user, _ := ctx.Value(types.UserScope).(*models.User)
  33. var apiContract porterv1.Contract
  34. err := helpers.UnmarshalContractObjectFromReader(r.Body, &apiContract)
  35. if err != nil {
  36. e := telemetry.Error(ctx, span, err, "error parsing api contract")
  37. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(e, http.StatusBadRequest))
  38. return
  39. }
  40. apiContract.User = &porterv1.User{
  41. Id: int32(user.ID),
  42. }
  43. updateRequest := connect.NewRequest(&porterv1.UpdateContractRequest{
  44. Contract: &apiContract,
  45. })
  46. revision, err := c.Config().ClusterControlPlaneClient.UpdateContract(ctx, updateRequest)
  47. if err != nil {
  48. e := telemetry.Error(ctx, span, err, "error sending contract for update")
  49. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(e, http.StatusInternalServerError))
  50. return
  51. }
  52. w.WriteHeader(http.StatusCreated)
  53. c.WriteResult(w, r, revision.Msg)
  54. }