list.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package deployment_target
  2. import (
  3. "net/http"
  4. "github.com/porter-dev/porter/api/server/handlers"
  5. "github.com/porter-dev/porter/api/server/shared"
  6. "github.com/porter-dev/porter/api/server/shared/apierrors"
  7. "github.com/porter-dev/porter/api/server/shared/config"
  8. "github.com/porter-dev/porter/api/types"
  9. "github.com/porter-dev/porter/internal/models"
  10. "github.com/porter-dev/porter/internal/telemetry"
  11. )
  12. // ListDeploymentTargetsHandler is the handler for the /deployment-targets endpoint
  13. type ListDeploymentTargetsHandler struct {
  14. handlers.PorterHandlerReadWriter
  15. }
  16. // NewListDeploymentTargetsHandler handles GET requests to the endpoint /deployment-targets
  17. func NewListDeploymentTargetsHandler(
  18. config *config.Config,
  19. decoderValidator shared.RequestDecoderValidator,
  20. writer shared.ResultWriter,
  21. ) *ListDeploymentTargetsHandler {
  22. return &ListDeploymentTargetsHandler{
  23. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  24. }
  25. }
  26. // ListDeploymentTargetsRequest is the request object for the /deployment-targets GET endpoint
  27. type ListDeploymentTargetsRequest struct {
  28. Preview bool `json:"preview"`
  29. }
  30. // ListDeploymentTargetsResponse is the response object for the /deployment-targets GET endpoint
  31. type ListDeploymentTargetsResponse struct {
  32. DeploymentTargets []types.DeploymentTarget `json:"deployment_targets"`
  33. }
  34. func (c *ListDeploymentTargetsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  35. ctx, span := telemetry.NewSpan(r.Context(), "serve-list-deployment-targets")
  36. defer span.End()
  37. project, _ := ctx.Value(types.ProjectScope).(*models.Project)
  38. cluster, _ := ctx.Value(types.ClusterScope).(*models.Cluster)
  39. if !project.GetFeatureFlag(models.ValidateApplyV2, c.Config().LaunchDarklyClient) {
  40. err := telemetry.Error(ctx, span, nil, "project does not have validate apply v2 enabled")
  41. c.HandleAPIError(w, r, apierrors.NewErrForbidden(err))
  42. return
  43. }
  44. request := &ListDeploymentTargetsRequest{}
  45. if ok := c.DecodeAndValidate(w, r, request); !ok {
  46. err := telemetry.Error(ctx, span, nil, "error decoding request")
  47. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
  48. return
  49. }
  50. deploymentTargets, err := c.Repo().DeploymentTarget().List(project.ID, cluster.ID, request.Preview)
  51. if err != nil {
  52. err := telemetry.Error(ctx, span, err, "error retrieving deployment targets")
  53. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  54. return
  55. }
  56. response := ListDeploymentTargetsResponse{
  57. DeploymentTargets: make([]types.DeploymentTarget, 0),
  58. }
  59. for _, dt := range deploymentTargets {
  60. if dt == nil {
  61. continue
  62. }
  63. response.DeploymentTargets = append(response.DeploymentTargets, *dt.ToDeploymentTargetType())
  64. }
  65. c.WriteResult(w, r, response)
  66. }