reader.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package shared
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/porter-dev/porter/api/server/shared/apierrors"
  6. "github.com/porter-dev/porter/api/server/shared/requestutils"
  7. "github.com/porter-dev/porter/internal/alerter"
  8. "github.com/porter-dev/porter/pkg/logger"
  9. )
  10. type RequestDecoderValidator interface {
  11. DecodeAndValidate(w http.ResponseWriter, r *http.Request, v interface{}) bool
  12. DecodeAndValidateNoWrite(r *http.Request, v interface{}) error
  13. }
  14. type DefaultRequestDecoderValidator struct {
  15. logger *logger.Logger
  16. alerter alerter.Alerter
  17. validator requestutils.Validator
  18. decoder requestutils.Decoder
  19. }
  20. func NewDefaultRequestDecoderValidator(
  21. logger *logger.Logger,
  22. alerter alerter.Alerter,
  23. ) RequestDecoderValidator {
  24. validator := requestutils.NewDefaultValidator()
  25. decoder := requestutils.NewDefaultDecoder()
  26. return &DefaultRequestDecoderValidator{logger, alerter, validator, decoder}
  27. }
  28. func (j *DefaultRequestDecoderValidator) DecodeAndValidate(
  29. w http.ResponseWriter,
  30. r *http.Request,
  31. v interface{},
  32. ) (ok bool) {
  33. var requestErr apierrors.RequestError
  34. // decode the request parameters (body and query)
  35. if requestErr = j.decoder.Decode(v, r); requestErr != nil {
  36. apierrors.HandleAPIError(j.logger, j.alerter, w, r, requestErr, true)
  37. return false
  38. }
  39. // validate the request object
  40. if requestErr = j.validator.Validate(v); requestErr != nil {
  41. apierrors.HandleAPIError(j.logger, j.alerter, w, r, requestErr, true)
  42. return false
  43. }
  44. return true
  45. }
  46. func (j *DefaultRequestDecoderValidator) DecodeAndValidateNoWrite(
  47. r *http.Request,
  48. v interface{},
  49. ) error {
  50. var requestErr apierrors.RequestError
  51. // decode the request parameters (body and query)
  52. if requestErr = j.decoder.Decode(v, r); requestErr != nil {
  53. return fmt.Errorf(requestErr.InternalError())
  54. }
  55. // validate the request object
  56. if requestErr = j.validator.Validate(v); requestErr != nil {
  57. return fmt.Errorf(requestErr.InternalError())
  58. }
  59. return nil
  60. }