@@ -52,15 +52,16 @@ export class RateLimitGuard implements CanActivate {
5252 const endpoint = `${ request . method } ${ request . route ?. path || request . url } ` ;
5353
5454 try {
55- // Check by user if authenticated
55+ const ip = this . getClientIp ( request ) ;
56+
5657 if ( request . user ?. id ) {
5758 const userTier = request . user . tier || 'free' ;
58- const userStatus = await this . rateLimitService . checkUserRateLimit (
59- request . user . id ,
60- userTier ,
61- ) ;
6259
63- // Apply rate limit headers
60+ const [ userStatus , userIpStatus ] = await Promise . all ( [
61+ this . rateLimitService . checkUserRateLimit ( request . user . id , userTier ) ,
62+ this . rateLimitService . checkUserIpRateLimit ( request . user . id , ip ) ,
63+ ] ) ;
64+
6465 Object . entries ( this . rateLimitService . getHeaders ( userStatus ) ) . forEach ( ( [ key , value ] ) => {
6566 response . setHeader ( key , value ) ;
6667 } ) ;
@@ -73,17 +74,24 @@ export class RateLimitGuard implements CanActivate {
7374 retryAfter : userStatus . retryAfter ,
7475 } ,
7576 HttpStatus . TOO_MANY_REQUESTS ,
77+ { cause : 'user_rate_limit_exceeded' } ,
78+ ) ;
79+ }
80+
81+ if ( userIpStatus . isExceeded ) {
82+ throw new HttpException (
7683 {
77- cause : 'user_rate_limit_exceeded' ,
84+ statusCode : HttpStatus . TOO_MANY_REQUESTS ,
85+ message : 'Too many requests from this account on this IP. Please try again later.' ,
86+ retryAfter : userIpStatus . retryAfter ,
7887 } ,
88+ HttpStatus . TOO_MANY_REQUESTS ,
89+ { cause : 'user_ip_rate_limit_exceeded' } ,
7990 ) ;
8091 }
8192 } else {
82- // Check by IP for unauthenticated requests
83- const ip = this . getClientIp ( request ) ;
8493 const ipStatus = await this . rateLimitService . checkIpRateLimit ( ip ) ;
8594
86- // Apply rate limit headers
8795 Object . entries ( this . rateLimitService . getHeaders ( ipStatus ) ) . forEach ( ( [ key , value ] ) => {
8896 response . setHeader ( key , value ) ;
8997 } ) ;
@@ -96,9 +104,7 @@ export class RateLimitGuard implements CanActivate {
96104 retryAfter : ipStatus . retryAfter ,
97105 } ,
98106 HttpStatus . TOO_MANY_REQUESTS ,
99- {
100- cause : 'ip_rate_limit_exceeded' ,
101- } ,
107+ { cause : 'ip_rate_limit_exceeded' } ,
102108 ) ;
103109 }
104110 }
0 commit comments