Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rate limit #230

Merged
merged 3 commits into from
Dec 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion v1/policy/fraud.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ func NewFraudDefinition(d *object.Definition) (*FraudDefinition, error) {
// FraudDefinition is the Fraud config object definition
type FraudDefinition struct{ def *object.Definition }

// Definition returns the ChargeExpiryDefinition structure
// Definition returns the FraudDefinition structure
func (d *FraudDefinition) Definition() *object.Definition { return d.def }

// MarshalJSON returns the JSON value for the FraudDefinition
Expand Down
9 changes: 9 additions & 0 deletions v1/policy/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ func GetHandlers() []object.KindHandler {
funcs = append(funcs, chargeExpiryPolicy()...)
funcs = append(funcs, chargePolicy()...)
funcs = append(funcs, methodUpgradePolicy()...)
funcs = append(funcs, rateLimitPolicy()...)
funcs = append(funcs, cascadePolicy()...)
funcs = append(funcs, methodLockPolicy()...)
funcs = append(funcs, methodVerifyPolicy()...)
Expand Down Expand Up @@ -57,6 +58,14 @@ func methodUpgradePolicy() []object.KindHandler {
}
}

func rateLimitPolicy() []object.KindHandler {
o := RateLimitPolicy{}
return []object.KindHandler{
object.NewKindHandler(o.GetKind(), object.KindHandlerDefaultVersion, func() object.Specification { return &RateLimitPolicy{} }),
object.NewKindHandler(o.GetKind(), o.GetVersion(), func() object.Specification { return &RateLimitPolicy{} }),
}
}

func cascadePolicy() []object.KindHandler {
o := CascadePolicy{}
return []object.KindHandler{
Expand Down
55 changes: 55 additions & 0 deletions v1/policy/rate_limit.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package policy

import (
"encoding/json"
"errors"

"github.com/chargehive/configuration/object"
)

// KindPolicyRateLimit is the identifier for a RateLimitPolicy config
const KindPolicyRateLimit object.Kind = "RateLimitPolicy"

type RateLimitKey string

const (
RateLimitKeyChargePlacementID RateLimitKey = "PlacementID"
RateLimitKeyMerchantReference RateLimitKey = "MerchantReference"
RateLimitKeyCorrelationID RateLimitKey = "CorrelationID"
RateLimitKeyBillingProfileID RateLimitKey = "BillingProfileID"
RateLimitKeyIP RateLimitKey = "IP"
RateLimitKeyUserAgent RateLimitKey = "UserAgent"
RateLimitKeyPlatform RateLimitKey = "Platform"
)

type RateLimitPolicy struct {
// LimitProperty is the property to limit the rate by, global if empty
LimitProperty RateLimitKey `json:"limitProperty" yaml:"limitProperty" validate:"oneof=PlacementID MerchantReference CorrelationID BillingProfileID IP UserAgent Platform"`
// HardLimit is the maximum number of requests allowed in the window
HardLimit int32 `json:"hardLimit" yaml:"hardLimit" validate:"required,min=1"`
// Window is the time window in minutes that the limit is applied to
Window int32 `json:"window" yaml:"window" validate:"required,min=1"`
}

func (r RateLimitPolicy) GetKind() object.Kind { return KindPolicyRateLimit }

func (r RateLimitPolicy) GetVersion() string { return "v1" }

type RateLimitDefinition struct{ def *object.Definition }

// NewRateLimitDefinition creates a new RateLimitDefinition
func NewRateLimitDefinition(d *object.Definition) (*RateLimitDefinition, error) {
if _, ok := d.Spec.(*RateLimitPolicy); ok {
return &RateLimitDefinition{def: d}, nil
}
return nil, errors.New("invalid Rate Limit Policy object")
}

// Definition returns the RateLimitDefinition structure
func (d *RateLimitDefinition) Definition() *object.Definition { return d.def }

// MarshalJSON returns the JSON value for the RateLimitDefinition
func (d *RateLimitDefinition) MarshalJSON() ([]byte, error) { return json.Marshal(d.def) }

// Spec returns the RateLimitPolicy contained within the RateLimitDefinition
func (d *RateLimitDefinition) Spec() *RateLimitPolicy { return d.def.Spec.(*RateLimitPolicy) }
Loading