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(&copy)
    54  }