portainer/portainer

View on GitHub
pkg/libhttp/request/payload.go

Summary

Maintainability
A
0 mins
Test Coverage
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
}