@@ -96,10 +96,10 @@ object AfterApiAuth extends MdcLoggable{
9696 * Please note that first source is the table RateLimiting and second is the table Consumer
9797 */
9898 def checkRateLimiting (userIsLockedOrDeleted : Future [(Box [User ], Option [CallContext ])]): Future [(Box [User ], Option [CallContext ])] = {
99- def getActiveLimits (consumerId : String ): Future [List [RateLimiting ]] = {
99+ def getRateLimiting (consumerId : String , version : String , name : String ): Future [Box [RateLimiting ]] = {
100100 RateLimitingUtil .useConsumerLimits match {
101- case true => RateLimitingDI .rateLimiting.vend.getActiveCallLimitsByConsumerIdAtDate (consumerId, new Date ())
102- case false => Future (List .empty )
101+ case true => RateLimitingDI .rateLimiting.vend.getByConsumerId (consumerId, version, name, Some ( new Date () ))
102+ case false => Future (Empty )
103103 }
104104 }
105105 for {
@@ -111,48 +111,34 @@ object AfterApiAuth extends MdcLoggable{
111111 name = cc.flatMap(_.resourceDocument.map(_.partialFunctionName)) // 1st try: function name at resource doc
112112 .orElse(operationId) // 2nd try: In case of Dynamic Endpoint we can only use operationId
113113 .getOrElse(" None" ) // Not found any unique identifier
114- activeLimits <- getActiveLimits (consumer.map(_.consumerId.get).getOrElse(" " ))
114+ rateLimiting <- getRateLimiting (consumer.map(_.consumerId.get).getOrElse(" " ), version, name )
115115 } yield {
116- // Find the most specific rate limiting record for this request
117- def findBestMatch (limits : List [RateLimiting ], version : String , name : String ): Option [RateLimiting ] = {
118- limits.find(rl => rl.apiVersion.contains(version) && rl.apiName.contains(name)) // 1st try: exact match
119- .orElse(limits.find(rl => rl.apiName.contains(name))) // 2nd try: match by name only
120- .orElse(limits.find(rl => rl.apiVersion.contains(version))) // 3rd try: match by version only
121- .orElse(limits.find(rl => rl.apiName.isEmpty && rl.apiVersion.isEmpty)) // 4th try: general consumer limit
122- .orElse(limits.headOption) // 5th try: any limit
123- }
124-
125- val limit : Option [CallLimit ] = if (activeLimits.nonEmpty) {
126- findBestMatch(activeLimits, version, name) match {
127- case Some (rl) => Some (CallLimit (
128- Some (rl.rateLimitingId),
129- rl.consumerId,
130- rl.apiName,
131- rl.apiVersion,
132- rl.bankId,
133- rl.perSecondCallLimit,
134- rl.perMinuteCallLimit,
135- rl.perHourCallLimit,
136- rl.perDayCallLimit,
137- rl.perWeekCallLimit,
138- rl.perMonthCallLimit))
139- case None => None
140- }
141- } else {
142- // Fallback to consumer limits if no database records found
143- consumer.map(c => CallLimit (
144- None ,
145- c.consumerId.get,
146- None ,
147- None ,
148- None ,
149- c.perSecondCallLimit.get,
150- c.perMinuteCallLimit.get,
151- c.perHourCallLimit.get,
152- c.perDayCallLimit.get,
153- c.perWeekCallLimit.get,
154- c.perMonthCallLimit.get
155- ))
116+ val limit : Option [CallLimit ] = rateLimiting match {
117+ case Full (rl) => Some (CallLimit (
118+ rl.consumerId,
119+ rl.apiName,
120+ rl.apiVersion,
121+ rl.bankId,
122+ rl.perSecondCallLimit,
123+ rl.perMinuteCallLimit,
124+ rl.perHourCallLimit,
125+ rl.perDayCallLimit,
126+ rl.perWeekCallLimit,
127+ rl.perMonthCallLimit))
128+ case Empty =>
129+ Some (CallLimit (
130+ consumer.map(_.consumerId.get).getOrElse(" " ),
131+ None ,
132+ None ,
133+ None ,
134+ consumer.map(_.perSecondCallLimit.get).getOrElse(- 1 ),
135+ consumer.map(_.perMinuteCallLimit.get).getOrElse(- 1 ),
136+ consumer.map(_.perHourCallLimit.get).getOrElse(- 1 ),
137+ consumer.map(_.perDayCallLimit.get).getOrElse(- 1 ),
138+ consumer.map(_.perWeekCallLimit.get).getOrElse(- 1 ),
139+ consumer.map(_.perMonthCallLimit.get).getOrElse(- 1 )
140+ ))
141+ case _ => None
156142 }
157143 (user, cc.map(_.copy(rateLimiting = limit)))
158144 }
0 commit comments