@@ -21,6 +21,7 @@ import (
2121 "github.com/redhatinsights/export-service-go/middleware"
2222 "github.com/redhatinsights/export-service-go/models"
2323 es3 "github.com/redhatinsights/export-service-go/s3"
24+ "golang.org/x/time/rate"
2425)
2526
2627// Export holds any dependencies necessary for the external api endpoints
@@ -30,6 +31,7 @@ type Export struct {
3031 DB models.DBInterface
3132 Log * zap.SugaredLogger
3233 RequestAppResources RequestApplicationResources
34+ RateLimiter * rate.Limiter
3335}
3436
3537// ExportRouter is a router for all of the external routes for the /exports endpoint.
@@ -61,8 +63,15 @@ func (e *Export) PostExport(w http.ResponseWriter, r *http.Request) {
6163
6264 logger := e .Log .With (export_logger .RequestIDField (reqID ), export_logger .OrgIDField (user .OrganizationID ))
6365
66+ err := e .RateLimiter .Wait (r .Context ())
67+ if err != nil {
68+ logger .Errorw ("Rate limit reached" , "error" , err )
69+ InternalServerError (w , err )
70+ return
71+ }
72+
6473 var apiExport ExportPayload
65- err : = json .NewDecoder (r .Body ).Decode (& apiExport )
74+ err = json .NewDecoder (r .Body ).Decode (& apiExport )
6675 if err != nil {
6776 logger .Errorw ("error while parsing params" , "error" , err )
6877 BadRequestError (w , err .Error ())
@@ -148,6 +157,13 @@ func (e *Export) ListExports(w http.ResponseWriter, r *http.Request) {
148157
149158 logger := e .Log .With (export_logger .RequestIDField (reqID ), export_logger .OrgIDField (user .OrganizationID ))
150159
160+ err := e .RateLimiter .Wait (r .Context ())
161+ if err != nil {
162+ logger .Errorw ("Rate limit reached" , "error" , err )
163+ InternalServerError (w , err )
164+ return
165+ }
166+
151167 q := r .URL .Query ()
152168
153169 params , err := initQuery (q )
@@ -190,6 +206,13 @@ func (e *Export) GetExport(w http.ResponseWriter, r *http.Request) {
190206 return
191207 }
192208
209+ err := e .RateLimiter .Wait (r .Context ())
210+ if err != nil {
211+ logger .Errorw ("Rate limit reached" , "error" , err )
212+ InternalServerError (w , err )
213+ return
214+ }
215+
193216 if export .Status != models .Complete && export .Status != models .Partial {
194217 logger .Infof ("'%s' not ready for download" , export .ID )
195218 BadRequestError (w , fmt .Sprintf ("'%s' is not ready for download" , export .ID ))
@@ -231,6 +254,13 @@ func (e *Export) DeleteExport(w http.ResponseWriter, r *http.Request) {
231254
232255 logger := e .Log .With (export_logger .RequestIDField (reqID ), export_logger .ExportIDField (uid ), export_logger .OrgIDField (user .OrganizationID ))
233256
257+ err = e .RateLimiter .Wait (r .Context ())
258+ if err != nil {
259+ logger .Errorw ("Rate limit reached" , "error" , err )
260+ InternalServerError (w , err )
261+ return
262+ }
263+
234264 modelUser := mapUsertoModelUser (user )
235265
236266 if err := e .DB .Delete (exportUUID , modelUser ); err != nil {
@@ -253,6 +283,13 @@ func (e *Export) GetExportStatus(w http.ResponseWriter, r *http.Request) {
253283
254284 logger := e .Log .With (export_logger .RequestIDField (reqID ), export_logger .OrgIDField (user .OrganizationID ))
255285
286+ err := e .RateLimiter .Wait (r .Context ())
287+ if err != nil {
288+ logger .Errorw ("Rate limit reached" , "error" , err )
289+ InternalServerError (w , err )
290+ return
291+ }
292+
256293 export := e .getExportWithUser (w , r , logger )
257294 if export == nil {
258295 return
0 commit comments