reader.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. )
  8. type RequestDecoderValidator interface {
  9. DecodeAndValidate(w http.ResponseWriter, r *http.Request, v interface{}) bool
  10. DecodeAndValidateNoWrite(r *http.Request, v interface{}) error
  11. }
  12. type DefaultRequestDecoderValidator struct {
  13. config *Config
  14. validator requestutils.Validator
  15. decoder requestutils.Decoder
  16. }
  17. func NewDefaultRequestDecoderValidator(
  18. config *Config,
  19. ) RequestDecoderValidator {
  20. validator := requestutils.NewDefaultValidator()
  21. decoder := requestutils.NewDefaultDecoder()
  22. return &DefaultRequestDecoderValidator{config, validator, decoder}
  23. }
  24. func (j *DefaultRequestDecoderValidator) DecodeAndValidate(
  25. w http.ResponseWriter,
  26. r *http.Request,
  27. v interface{},
  28. ) (ok bool) {
  29. var requestErr apierrors.RequestError
  30. // decode the request parameters (body and query)
  31. if requestErr = j.decoder.Decode(v, r); requestErr != nil {
  32. apierrors.HandleAPIError(w, j.config.Logger, requestErr)
  33. return false
  34. }
  35. // validate the request object
  36. if requestErr = j.validator.Validate(v); requestErr != nil {
  37. apierrors.HandleAPIError(w, j.config.Logger, requestErr)
  38. return false
  39. }
  40. return true
  41. }
  42. func (j *DefaultRequestDecoderValidator) DecodeAndValidateNoWrite(
  43. r *http.Request,
  44. v interface{},
  45. ) error {
  46. var requestErr apierrors.RequestError
  47. // decode the request parameters (body and query)
  48. if requestErr = j.decoder.Decode(v, r); requestErr != nil {
  49. return fmt.Errorf(requestErr.InternalError())
  50. }
  51. // validate the request object
  52. if requestErr = j.validator.Validate(v); requestErr != nil {
  53. return fmt.Errorf(requestErr.InternalError())
  54. }
  55. return nil
  56. }