|
1 | 1 | import { type NextRequest, NextResponse } from "next/server"; |
2 | | -import { Ratelimit } from "@upstash/ratelimit"; |
3 | | -import { kv } from "@vercel/kv"; |
4 | | - |
5 | | -const ratelimit = new Ratelimit({ |
6 | | - redis: kv, |
7 | | - limiter: Ratelimit.slidingWindow(100, "900 s"), |
8 | | -}); |
| 2 | +import { |
| 3 | + aiUploadRatelimit, |
| 4 | + paperRequestRatelimit, |
| 5 | + subscribeRatelimit, |
| 6 | +} from "./lib/utils/ratelimit"; |
9 | 7 |
|
10 | 8 | export const config = { |
11 | | - matcher: "/api/upload", |
| 9 | + matcher: ["/api/upload", "/api/request", "/api/subscribe"], |
12 | 10 | }; |
13 | 11 |
|
14 | 12 | export default async function middleware(request: NextRequest) { |
15 | 13 | const ip = request.ip ?? "127.0.0.1"; |
16 | | - const { success } = await ratelimit.limit(ip); |
17 | | - return success |
18 | | - ? NextResponse.next() |
19 | | - : NextResponse.json( |
| 14 | + const { pathname } = request.nextUrl; |
| 15 | + |
| 16 | + if (pathname === "/api/upload") { |
| 17 | + const { success } = await aiUploadRatelimit.limit(ip); |
| 18 | + if (!success) { |
| 19 | + return NextResponse.json( |
20 | 20 | { message: "You can upload a maximum of 5 papers every 15 minutes" }, |
21 | 21 | { status: 429 }, |
22 | 22 | ); |
| 23 | + } |
| 24 | + } |
| 25 | + |
| 26 | + if (pathname === "/api/request") { |
| 27 | + const { success } = await paperRequestRatelimit.limit(ip); |
| 28 | + if (!success) { |
| 29 | + return NextResponse.json( |
| 30 | + { message: "You can submit a maximum of 5 requests every 15 minutes" }, |
| 31 | + { status: 429 }, |
| 32 | + ); |
| 33 | + } |
| 34 | + } |
| 35 | + |
| 36 | + if (pathname === "/api/subscribe") { |
| 37 | + const { success } = await subscribeRatelimit.limit(ip); |
| 38 | + if (!success) { |
| 39 | + return NextResponse.json( |
| 40 | + { message: "Maximum of 3 newsletter subscriptions per hour" }, |
| 41 | + { status: 429 }, |
| 42 | + ); |
| 43 | + } |
| 44 | + } |
| 45 | + |
| 46 | + return NextResponse.next(); |
23 | 47 | } |
| 48 | + |
0 commit comments