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