summaryrefslogtreecommitdiff
path: root/apps/web/src/lib
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2025-06-22 13:21:03 +0200
committerMaze Winther <mazewinther@gmail.com>2025-06-22 13:21:03 +0200
commitfaca97f1ae1ba870673347f98557191fcd5c123a (patch)
tree4c245e85f07677bb8545dd4068bca1b156e853d6 /apps/web/src/lib
parentceb253f5853e5f8f813b970c09cc5edceb6f9727 (diff)
downloadopencut-faca97f1ae1ba870673347f98557191fcd5c123a.tar.gz
add upstash rate limiting
Diffstat (limited to 'apps/web/src/lib')
-rw-r--r--apps/web/src/lib/db/schema.ts8
-rw-r--r--apps/web/src/lib/rate-limit.ts14
2 files changed, 22 insertions, 0 deletions
diff --git a/apps/web/src/lib/db/schema.ts b/apps/web/src/lib/db/schema.ts
index 02df5d4a..7c38724a 100644
--- a/apps/web/src/lib/db/schema.ts
+++ b/apps/web/src/lib/db/schema.ts
@@ -59,3 +59,11 @@ export const verifications = pgTable("verifications", {
() => /* @__PURE__ */ new Date()
),
}).enableRLS();
+
+export const waitlist = pgTable("waitlist", {
+ id: text("id").primaryKey(),
+ email: text("email").notNull().unique(),
+ createdAt: timestamp("created_at")
+ .$defaultFn(() => /* @__PURE__ */ new Date())
+ .notNull(),
+}).enableRLS();
diff --git a/apps/web/src/lib/rate-limit.ts b/apps/web/src/lib/rate-limit.ts
new file mode 100644
index 00000000..bf1cce02
--- /dev/null
+++ b/apps/web/src/lib/rate-limit.ts
@@ -0,0 +1,14 @@
+// lib/rate-limit.ts
+import { Ratelimit } from "@upstash/ratelimit";
+import { Redis } from "@upstash/redis";
+
+const redis = new Redis({
+ url: process.env.UPSTASH_REDIS_REST_URL!,
+ token: process.env.UPSTASH_REDIS_REST_TOKEN!,
+});
+
+export const waitlistRateLimit = new Ratelimit({
+ redis,
+ limiter: Ratelimit.slidingWindow(5, "1 m"), // 5 requests per minute
+ analytics: true,
+});