github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/design/rates/README.md (about)

     1  # Motivation
     2  
     3  [Verifiable Fields with Rate Limits](https://dev.heeus.io/launchpad/#!24713)
     4  
     5  # Functional design
     6  Declare func with rate limit:
     7  ```go
     8  AppConfig.FunctionRateLimits.AddAppLimit(
     9  	QName("sys.InitiateEmailVerification"), istructs.RateLimit{
    10  		Period:                24*time.Hour,
    11  		MaxAllowedPerDuration: 3,
    12  	}
    13  )
    14  AppConfig.FunctionRateLimits.AddWorkspaceLimit(
    15  	QName("sys.InitiateEmailVerification"), istructs.RateLimit{
    16  		Period:                time.Hour,
    17  		MaxAllowedPerDuration: 3,
    18  	}
    19  )
    20  ```
    21  
    22  Check rate limit:
    23  ```go
    24  if IAppStructs.IsFunctionRateLimitsExceeded(funcQName, WSID) {
    25  	return utils.NewHTTPErrorf(http.StatusTooManyRequests)
    26  }
    27  ```
    28  
    29  # Technical design
    30  ```mermaid
    31  erDiagram
    32  
    33  IAppStructs ||--|| appConfig: "has internal"
    34  IAppStructs ||--|| appStructs: "implemented by"
    35  appConfig ||--|| FunctionRateLimits: "has object"
    36  FunctionRateLimits ||--|| AddAppLimit: "has method"
    37  FunctionRateLimits ||--|| AddWorkspaceLimit: "has method"
    38  AddAppLimit ||..|| rateLimits: "writes to"
    39  AddWorkspaceLimit ||..|| rateLimits: "writes to"
    40  appStructs ||--|| IBuckets: has
    41  FunctionRateLimits ||--|| rateLimits: "has map funcQName->istructs.RateLimit"
    42  IBuckets ||--|| TakeTokens: "has method"
    43  IAppStructs ||--|| IsFunctionRateLimitsExceeded: "has method"
    44  rateLimits ||..|| IsFunctionRateLimitsExceeded: "used by"
    45  IsFunctionRateLimitsExceeded ||..|| TakeTokens: calls
    46  TakeTokens ||--|| bool: "has result"
    47  IsFunctionRateLimitsExceeded ||--|| bool: returns
    48  ```
    49  # Limitations
    50  - IBuckets are per-app for now