github.com/mendersoftware/go-lib-micro@v0.0.0-20240304135804-e8e39c59b148/ratelimits/limits.go (about) 1 // Copyright 2023 Northern.tech AS 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 package ratelimits 15 16 import ( 17 "encoding/json" 18 ) 19 20 // ApiBurst defines minimal interval (seconds) between subsequent calls to action on uri 21 type ApiBurst struct { 22 Action string `json:"action" bson:"action"` 23 Uri string `json:"uri" bson:"uri"` 24 MinIntervalSec int `json:"min_interval_sec" bson:"min_interval_sec"` 25 } 26 27 // ApiQuota defines the ratelimit quota as max number of calls in a given time interval (in seconds) 28 // MaxCalls == 0 means 'no quota limit' 29 type ApiQuota struct { 30 MaxCalls int `json:"max_calls" bson:"max_calls"` 31 IntervalSec int `json:"interval_sec" bson:"interval_sec"` 32 } 33 34 // ApiLimits combines burst limits and usage quota limits 35 type ApiLimits struct { 36 ApiBursts []ApiBurst `json:"bursts" bson:"bursts"` 37 ApiQuota ApiQuota `json:"quota" bson:"quota"` 38 } 39 40 // MarshalJSON makes sure even defaut nil ApiLimits.ApiBursts are actually empty lists 41 func (al ApiLimits) MarshalJSON() ([]byte, error) { 42 if al.ApiBursts == nil { 43 al.ApiBursts = make([]ApiBurst, 0) 44 } 45 46 type Copy ApiLimits 47 copy := struct { 48 Copy 49 }{ 50 Copy: (Copy)(al), 51 } 52 53 return json.Marshal(©) 54 }