From b1ae40b715f6f5da4abdcb6052c4bb3d06a482db Mon Sep 17 00:00:00 2001 From: Lucas dos Santos Abreu Date: Fri, 29 Mar 2024 19:25:57 -0300 Subject: [PATCH] chore: prevent too many requests --- api/client.go | 13 ++++++++++++- api/httpClient.go | 7 +++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/api/client.go b/api/client.go index 286c13f9..bed5b0ac 100644 --- a/api/client.go +++ b/api/client.go @@ -445,7 +445,18 @@ func (c *client) GetUsersHydratedTimeEntries(p GetUserTimeEntriesParam) ([]dto.T return timeEntries, err } - user, err := c.GetUser(GetUser{p.Workspace, p.UserID}) + var user dto.User + tries := 0 + for tries < 5 { + tries++ + user, err = c.GetUser(GetUser{p.Workspace, p.UserID}) + if err == nil || !errors.Is(err, ErrorTooManyRequests) { + break + } + + time.Sleep(time.Duration(5)) + } + if err != nil { return timeEntries, err } diff --git a/api/httpClient.go b/api/httpClient.go index 79ed028e..f57d58b7 100644 --- a/api/httpClient.go +++ b/api/httpClient.go @@ -22,6 +22,9 @@ var ErrorNotFound = dto.Error{Message: "Nothing was found", Code: 404} // ErrorForbidden Forbidden var ErrorForbidden = dto.Error{Message: "Forbidden", Code: 403} +// ErrorTooManyRequests Too Many Requests +var ErrorTooManyRequests = dto.Error{Message: "Too Many Requests", Code: 429} + type transport struct { apiKey string next http.RoundTripper @@ -112,6 +115,10 @@ func (c *client) Do( apiErr = ErrorForbidden } + if r.StatusCode == 429 && apiErr.Message == "" { + apiErr = ErrorTooManyRequests + } + if apiErr.Message == "" { apiErr.Message = "No response" }