Files
hatchet/pkg/integrations/shared/webhookutils/decoder_validator.go
abelanger5 197bdd1f88 feat: exponential backoff (#1062)
* initial migration

* feat: exp backoff, fix linting

* fix utc issue and cleanup
2024-11-21 13:39:02 -05:00

95 lines
2.3 KiB
Go

package webhookutils
import (
"net/http"
"github.com/rs/zerolog"
"github.com/hatchet-dev/hatchet/pkg/errors"
"github.com/hatchet-dev/hatchet/pkg/validator"
)
type RequestDecoderValidator interface {
DecodeAndValidate(w http.ResponseWriter, r *http.Request, v interface{}) bool
DecodeAndValidateQueryOnly(w http.ResponseWriter, r *http.Request, v interface{}) bool
DecodeAndValidateNoWrite(r *http.Request, v interface{}) error
}
type DefaultRequestDecoderValidator struct {
logger *zerolog.Logger
alerter errors.Alerter
validator validator.Validator
decoder Decoder
}
func NewDefaultRequestDecoderValidator(
logger *zerolog.Logger,
alerter errors.Alerter,
) RequestDecoderValidator {
validator := validator.NewDefaultValidator()
decoder := NewDefaultDecoder()
return &DefaultRequestDecoderValidator{logger, alerter, validator, decoder}
}
func (j *DefaultRequestDecoderValidator) DecodeAndValidate(
w http.ResponseWriter,
r *http.Request,
v interface{},
) (ok bool) {
var requestErr error
// decode the request parameters (body and query)
if requestErr = j.decoder.Decode(v, r); requestErr != nil {
HandleAPIError(j.logger, j.alerter, w, r, requestErr, true)
return false
}
// validate the request object
if requestErr = j.validator.Validate(v); requestErr != nil {
HandleAPIError(j.logger, j.alerter, w, r, requestErr, true)
return false
}
return true
}
func (j *DefaultRequestDecoderValidator) DecodeAndValidateQueryOnly(
w http.ResponseWriter,
r *http.Request,
v interface{},
) (ok bool) {
var requestErr error
// decode the request parameters (body and query)
if requestErr = j.decoder.DecodeQueryOnly(v, r); requestErr != nil {
HandleAPIError(j.logger, j.alerter, w, r, requestErr, true)
return false
}
// validate the request object
if requestErr = j.validator.Validate(v); requestErr != nil {
HandleAPIError(j.logger, j.alerter, w, r, requestErr, true)
return false
}
return true
}
func (j *DefaultRequestDecoderValidator) DecodeAndValidateNoWrite(
r *http.Request,
v interface{},
) error {
// decode the request parameters (body and query)
if requestErr := j.decoder.Decode(v, r); requestErr != nil {
return requestErr
}
// validate the request object
if requestErr := j.validator.Validate(v); requestErr != nil {
return requestErr
}
return nil
}