reader.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package shared
  2. import (
  3. "net/http"
  4. "github.com/porter-dev/porter/api/server/requestutils"
  5. "github.com/porter-dev/porter/api/server/shared/apierrors"
  6. )
  7. type RequestDecoderValidator interface {
  8. DecodeAndValidate(w http.ResponseWriter, r *http.Request, v interface{}) bool
  9. }
  10. type DefaultRequestDecoderValidator struct {
  11. config *Config
  12. validator requestutils.Validator
  13. decoder requestutils.Decoder
  14. }
  15. func NewDefaultRequestDecoderValidator(
  16. config *Config,
  17. validator requestutils.Validator,
  18. decoder requestutils.Decoder,
  19. ) RequestDecoderValidator {
  20. return &DefaultRequestDecoderValidator{config, validator, decoder}
  21. }
  22. func (j *DefaultRequestDecoderValidator) DecodeAndValidate(
  23. w http.ResponseWriter,
  24. r *http.Request,
  25. v interface{},
  26. ) (ok bool) {
  27. var requestErr apierrors.RequestError
  28. // decode the request parameters (body and query)
  29. if requestErr = j.decoder.Decode(v, r); requestErr != nil {
  30. apierrors.HandleAPIError(w, j.config.Logger, requestErr)
  31. return false
  32. }
  33. // validate the request object
  34. if requestErr = j.validator.Validate(v); requestErr != nil {
  35. apierrors.HandleAPIError(w, j.config.Logger, requestErr)
  36. return false
  37. }
  38. return true
  39. }