Skip to content
Merged
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
"@stellar/stellar-sdk": "^13.3.0",
"@types/multer": "^1.4.12",
"@types/rate-limit-redis": "^1.7.4",

"auth0-js": "^9.28.0",
"axios": "^1.8.1",
"bcryptjs": "^2.4.3",
Expand Down
4 changes: 4 additions & 0 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ import { oauthConfig } from "./config/auth0Config";
import { auth } from "express-openid-connect";
import { auditMiddleware } from "./middlewares/auditMiddleware";
import routes from "./routes";
import intelligentRateLimiter from "./middleware/rateLimiter";
import rateLimitMonitoringService from "./services/rateLimitMonitoring.service";

// Initialize express app
const app = express();
Expand Down Expand Up @@ -76,6 +78,8 @@ app.use(
);
app.use(globalRateLimiter as RequestHandler);
app.use(requestLogger as RequestHandler);
app.use(intelligentRateLimiter);
app.use(rateLimitMonitoringService.createRateLimitMonitoringMiddleware());

// Add timeout configurations
app.use((req, res, next) => {
Expand Down
4 changes: 3 additions & 1 deletion src/config/db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ import { ReferralReward } from "../entities/ReferralReward";
import { ReferralProgram } from "../entities/ReferralProgram";
import { AuditLog } from "../entities/AuditLog";
import { AuditSubscriber } from "../subscribers/AuditSubscriber";
import { Wallet } from "src/entities/Wallet";
import { Wallet } from "../entities/Wallet";
import { Transaction } from "../entities/Transaction";

dotenv.config();

Expand Down Expand Up @@ -45,6 +46,7 @@ const AppDataSource = new DataSource({
ReferralProgram,
AuditLog,
Wallet,
Transaction,
],
subscribers: [AuditSubscriber],
migrations: ["src/migrations/*.ts"],
Expand Down
82 changes: 82 additions & 0 deletions src/config/rateLimitConfig.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import { UserRole } from "../enums/UserRole";

export interface RateLimitTier {
name: string;
description: string;
limits: {
requestsPerSecond: number;
requestsPerMinute: number;
requestsPerHour: number;
requestsPerDay: number;
};
burstMultiplier: number;
burstDurationSeconds: number;
}

export interface MerchantTypeRateLimits {
[key: string]: RateLimitTier;
}

export interface UserRoleRateLimits {
[key: string]: RateLimitTier;
}

////////////////////////////////////
// Default rate limit tiers
////////////////////////////////////
export const DEFAULT_RATE_LIMIT_TIERS: Record<string, RateLimitTier> = {
basic: {
name: "Basic",
description: "Default rate limits for standard users",
limits: {
requestsPerSecond: 5,
requestsPerMinute: 60,
requestsPerHour: 1000,
requestsPerDay: 10000,
},
burstMultiplier: 2,
burstDurationSeconds: 30,
},
premium: {
name: "Premium",
description: "Higher limits for premium users",
limits: {
requestsPerSecond: 10,
requestsPerMinute: 300,
requestsPerHour: 3000,
requestsPerDay: 50000,
},
burstMultiplier: 2,
burstDurationSeconds: 30,
},
enterprise: {
name: "Enterprise",
description: "Highest limits for enterprise users",
limits: {
requestsPerSecond: 50,
requestsPerMinute: 1000,
requestsPerHour: 10000,
requestsPerDay: 100000,
},
burstMultiplier: 2,
burstDurationSeconds: 30,
},
};

////////////////////////////////////
// Default rate limits by user role
////////////////////////////////////

export const DEFAULT_USER_ROLE_LIMITS: UserRoleRateLimits = {
[UserRole.USER]: DEFAULT_RATE_LIMIT_TIERS.basic,
[UserRole.ADMIN]: DEFAULT_RATE_LIMIT_TIERS.premium,
};

////////////////////////////////////
// Default rate limits by merchant type
////////////////////////////////////
export const DEFAULT_MERCHANT_TYPE_LIMITS: MerchantTypeRateLimits = {
standard: DEFAULT_RATE_LIMIT_TIERS.basic,
premium: DEFAULT_RATE_LIMIT_TIERS.premium,
enterprise: DEFAULT_RATE_LIMIT_TIERS.enterprise,
};
Loading
Loading