mirror of https://github.com/portainer/portainer
38 lines
1.0 KiB
Go
38 lines
1.0 KiB
Go
package request
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/segmentio/encoding/json"
|
|
)
|
|
|
|
// PayloadValidation is an interface used to validate the payload of a request.
|
|
type PayloadValidation interface {
|
|
Validate(request *http.Request) error
|
|
}
|
|
|
|
// DecodeAndValidateJSONPayload decodes the body of the request into an object
|
|
// implementing the PayloadValidation interface.
|
|
// It also triggers a validation of object content.
|
|
func DecodeAndValidateJSONPayload(request *http.Request, v PayloadValidation) error {
|
|
if err := json.NewDecoder(request.Body).Decode(v); err != nil {
|
|
return err
|
|
}
|
|
return v.Validate(request)
|
|
}
|
|
|
|
// GetPayload decodes the body of the request into an object implementing the PayloadValidation interface.
|
|
func GetPayload[T any, PT interface {
|
|
*T
|
|
Validate(request *http.Request) error
|
|
}](r *http.Request) (PT, error) {
|
|
p := PT(new(T))
|
|
|
|
err := DecodeAndValidateJSONPayload(r, p)
|
|
if err != nil {
|
|
return nil, errors.WithMessage(err, "Invalid request payload")
|
|
}
|
|
return p, nil
|
|
}
|