diff --git a/apps/api/src/services/notification/email_notification.ts b/apps/api/src/services/notification/email_notification.ts index 06bcaa6..e5102ac 100644 --- a/apps/api/src/services/notification/email_notification.ts +++ b/apps/api/src/services/notification/email_notification.ts @@ -3,9 +3,6 @@ import { withAuth } from "../../lib/withAuth"; import { Resend } from "resend"; import { NotificationType } from "../../types"; - - - const emailTemplates: Record< NotificationType, { subject: string; html: string } @@ -15,7 +12,8 @@ const emailTemplates: Record< html: "Hey there,

You are approaching your credit limit for this billing period. Your usage right now is around 80% of your total credit limit. Consider upgrading your plan to avoid hitting the limit. Check out our pricing page for more info.


Thanks,
Firecrawl Team
", }, [NotificationType.LIMIT_REACHED]: { - subject: "Credit Limit Reached! Take action now to resume usage - Firecrawl", + subject: + "Credit Limit Reached! Take action now to resume usage - Firecrawl", html: "Hey there,

You have reached your credit limit for this billing period. To resume usage, please upgrade your plan. Check out our pricing page for more info.


Thanks,
Firecrawl Team
", }, [NotificationType.RATE_LIMIT_REACHED]: { @@ -42,7 +40,7 @@ async function sendEmailNotification( email: string, notificationType: NotificationType ) { -const resend = new Resend(process.env.RESEND_API_KEY); + const resend = new Resend(process.env.RESEND_API_KEY); try { const { data, error } = await resend.emails.send({ @@ -69,6 +67,9 @@ export async function sendNotificationInternal( startDateString: string, endDateString: string ): Promise<{ success: boolean }> { + if (team_id === "preview") { + return { success: true }; + } const { data, error } = await supabase_service .from("user_notifications") .select("*") diff --git a/apps/api/src/services/rate-limiter.ts b/apps/api/src/services/rate-limiter.ts index 51543a6..d0f937f 100644 --- a/apps/api/src/services/rate-limiter.ts +++ b/apps/api/src/services/rate-limiter.ts @@ -4,6 +4,7 @@ import { RateLimiterMode } from "../../src/types"; const RATE_LIMITS = { crawl: { + default: 3, free: 2, starter: 3, standard: 5, @@ -14,6 +15,7 @@ const RATE_LIMITS = { growth: 50, }, scrape: { + default: 20, free: 5, starter: 20, standard: 50, @@ -24,6 +26,7 @@ const RATE_LIMITS = { growth: 500, }, search: { + default: 20, free: 5, starter: 20, standard: 40, @@ -33,10 +36,18 @@ const RATE_LIMITS = { standardNew: 50, growth: 500, }, - preview: 5, - account: 20, - crawlStatus: 150, - testSuite: 10000, + preview: { + default: 5, + }, + account: { + default: 20, + }, + crawlStatus: { + default: 150, + }, + testSuite: { + default: 10000, + }, }; export const redisClient = redis.createClient({ @@ -44,30 +55,46 @@ export const redisClient = redis.createClient({ legacyMode: true, }); -const createRateLimiter = (keyPrefix, points) => new RateLimiterRedis({ - storeClient: redisClient, - keyPrefix, - points, - duration: 60, // Duration in seconds -}); +const createRateLimiter = (keyPrefix, points) => + new RateLimiterRedis({ + storeClient: redisClient, + keyPrefix, + points, + duration: 60, // Duration in seconds + }); -export const previewRateLimiter = createRateLimiter("preview", RATE_LIMITS.preview); -export const serverRateLimiter = createRateLimiter("server", RATE_LIMITS.account); -export const crawlStatusRateLimiter = createRateLimiter("crawl-status", RATE_LIMITS.crawlStatus); -export const testSuiteRateLimiter = createRateLimiter("test-suite", RATE_LIMITS.testSuite); +export const previewRateLimiter = createRateLimiter( + "preview", + RATE_LIMITS.preview +); +export const serverRateLimiter = createRateLimiter( + "server", + RATE_LIMITS.account +); +export const crawlStatusRateLimiter = createRateLimiter( + "crawl-status", + RATE_LIMITS.crawlStatus +); +export const testSuiteRateLimiter = createRateLimiter( + "test-suite", + RATE_LIMITS.testSuite +); -export function getRateLimiter(mode: RateLimiterMode, token: string, plan?: string) { +export function getRateLimiter( + mode: RateLimiterMode, + token: string, + plan?: string +) { if (token.includes("a01ccae") || token.includes("6254cf9")) { return testSuiteRateLimiter; } - - const rateLimitConfig = RATE_LIMITS[mode]; + const rateLimitConfig = RATE_LIMITS[mode]; // {default : 5} if (!rateLimitConfig) return serverRateLimiter; - const planKey = plan ? plan.replace("-", "") : "starter"; - const points = rateLimitConfig[planKey] || rateLimitConfig.preview; + const planKey = plan ? plan.replace("-", "") : "default"; // "default" + const points = + rateLimitConfig[planKey] || rateLimitConfig.default || rateLimitConfig; // 5 - return createRateLimiter(`${mode}-${planKey}`, points); }