From ada7ec0133dd7be868557faf95bf3297f6fba419 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji <88056492+atridadl@users.noreply.github.com> Date: Wed, 12 Jul 2023 12:39:56 -0600 Subject: [PATCH] ratelimit issues --- .env.example | 2 - package.json | 3 +- src/env.mjs | 4 - src/pages/room/[id].tsx | 216 ++++++++++++++++++++-------------------- src/server/api/trpc.ts | 33 +----- 5 files changed, 116 insertions(+), 142 deletions(-) diff --git a/.env.example b/.env.example index 9ea8a2a..983bd1e 100644 --- a/.env.example +++ b/.env.example @@ -5,8 +5,6 @@ DATABASE_URL="" UPSTASH_REDIS_REST_URL="" UPSTASH_REDIS_REST_TOKEN="" UPSTASH_REDIS_EXPIRY_SECONDS="" -UPSTASH_RATELIMIT_REQUESTS="" -UPSTASH_RATELIMIT_SECONDS="" #Next Auth Core NEXTAUTH_SECRET="" diff --git a/package.json b/package.json index 32ba203..e1365f6 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "@trpc/next": "10.34.0", "@trpc/react-query": "10.34.0", "@trpc/server": "10.34.0", - "@upstash/ratelimit": "^0.4.3", "@upstash/redis": "^1.22.0", "ably": "^1.2.41", "autoprefixer": "^10.4.14", @@ -55,4 +54,4 @@ "ct3aMetadata": { "initVersion": "7.5.9" } -} \ No newline at end of file +} diff --git a/src/env.mjs b/src/env.mjs index 4c1f2de..0ddd359 100644 --- a/src/env.mjs +++ b/src/env.mjs @@ -9,8 +9,6 @@ const server = z.object({ UPSTASH_REDIS_REST_URL: z.string().url(), UPSTASH_REDIS_REST_TOKEN: z.string(), UPSTASH_REDIS_EXPIRY_SECONDS: z.string(), - UPSTASH_RATELIMIT_REQUESTS: z.string(), - UPSTASH_RATELIMIT_SECONDS: z.string(), NODE_ENV: z.enum(["development", "test", "production"]), NEXTAUTH_SECRET: process.env.NODE_ENV === "production" @@ -52,8 +50,6 @@ const processEnv = { UPSTASH_REDIS_REST_URL: process.env.UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN: process.env.UPSTASH_REDIS_REST_TOKEN, UPSTASH_REDIS_EXPIRY_SECONDS: process.env.UPSTASH_REDIS_EXPIRY_SECONDS, - UPSTASH_RATELIMIT_REQUESTS: process.env.UPSTASH_RATELIMIT_REQUESTS, - UPSTASH_RATELIMIT_SECONDS: process.env.UPSTASH_RATELIMIT_SECONDS, NODE_ENV: process.env.NODE_ENV, NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET, NEXTAUTH_URL: process.env.NEXTAUTH_URL, diff --git a/src/pages/room/[id].tsx b/src/pages/room/[id].tsx index 3a2e6c4..98bd56a 100644 --- a/src/pages/room/[id].tsx +++ b/src/pages/room/[id].tsx @@ -3,6 +3,7 @@ import Head from "next/head"; import Image from "next/image"; import { useEffect, useState } from "react"; +import { useSession } from "next-auth/react"; import { useRouter } from "next/router"; import { IoCheckmarkCircleOutline, @@ -25,7 +26,6 @@ import { RiVipCrownFill } from "react-icons/ri"; import { env } from "~/env.mjs"; import { downloadCSV } from "~/utils/helpers"; import type { PresenceItem } from "~/utils/types"; -import { Session } from "next-auth"; export const getServerSideProps: GetServerSideProps = async (ctx) => { const session = await getServerAuthSession(ctx); @@ -46,7 +46,7 @@ export const getServerSideProps: GetServerSideProps = async (ctx) => { }; }; -const Room: NextPage<{ session: Session }> = ({ session }) => { +const Room: NextPage = () => { return ( <> @@ -55,7 +55,7 @@ const Room: NextPage<{ session: Session }> = ({ session }) => {
- +
); @@ -63,7 +63,8 @@ const Room: NextPage<{ session: Session }> = ({ session }) => { export default Room; -const RoomBody: React.FC<{ session: Session }> = ({ session }) => { +const RoomBody: React.FC = ({}) => { + const { data: sessionData } = useSession(); const { query } = useRouter(); const roomId = z.string().parse(query.id); @@ -82,7 +83,7 @@ const RoomBody: React.FC<{ session: Session }> = ({ session }) => { configureAbly({ key: env.NEXT_PUBLIC_ABLY_PUBLIC_KEY, - clientId: session.user.id, + clientId: sessionData?.user.id, recover: (_, cb) => { cb(true); }, @@ -105,10 +106,10 @@ const RoomBody: React.FC<{ session: Session }> = ({ session }) => { const [presenceData] = usePresence( `${env.NEXT_PUBLIC_APP_ENV}-${roomId}`, { - name: session.user.name || "", - image: session.user.image || "", - client_id: session.user.id || "", - role: session.user.role || "USER", + name: sessionData?.user.name || "", + image: sessionData?.user.image || "", + client_id: sessionData?.user.id || "", + role: sessionData?.user.role || "USER", } ); @@ -125,18 +126,18 @@ const RoomBody: React.FC<{ session: Session }> = ({ session }) => { // Init story name useEffect(() => { - if (session && roomFromDb) { + if (sessionData && roomFromDb) { setStoryNameText(roomFromDb.storyName || ""); setRoomScale(roomFromDb.scale || "ERROR"); } - }, [roomFromDb, roomId, session]); + }, [roomFromDb, roomId, sessionData]); // Helper functions const getVoteForCurrentUser = () => { - if (roomFromDb && session) { + if (roomFromDb && sessionData) { return ( votesFromDb && - votesFromDb.find((vote) => vote.userId === session.user.id) + votesFromDb.find((vote) => vote.userId === sessionData.user.id) ); } else { return null; @@ -353,108 +354,111 @@ const RoomBody: React.FC<{ session: Session }> = ({ session }) => { )} - {session && !!roomFromDb && roomFromDb.userId === session.user.id && ( - <> -
-
-

Room Settings

+ {sessionData && + !!roomFromDb && + roomFromDb.userId === sessionData.user.id && ( + <> +
+
+

Room Settings

- + - { - setRoomScale(event.target.value); - }} - /> + { + setRoomScale(event.target.value); + }} + /> - + - { - setStoryNameText(event.target.value); - }} - /> + { + setStoryNameText(event.target.value); + }} + /> -
-
- -
- -
- -
- - {votesFromDb && - (roomFromDb.logs.length > 0 || votesFromDb.length > 0) && ( -
- -
- )} + ) : ( + <> + + Show + + )} + +
+ +
+ +
+ + {votesFromDb && + (roomFromDb.logs.length > 0 || + votesFromDb.length > 0) && ( +
+ +
+ )} +
-
- - )} + + )} ); // Room does not exist diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index 03be699..d6f73c4 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -65,7 +65,6 @@ export const createTRPCContext = async (opts: CreateNextContextOptions) => { * This is where the tRPC API is initialized, connecting the context and transformer. */ import { initTRPC, TRPCError } from "@trpc/server"; -import { Ratelimit } from "@upstash/ratelimit"; import superjson from "superjson"; import { env } from "~/env.mjs"; @@ -106,33 +105,11 @@ const enforceRouteProtection = t.middleware(async ({ ctx, next }) => { throw new TRPCError({ code: "UNAUTHORIZED" }); } - try { - const rateLimit = new Ratelimit({ - redis: Redis.fromEnv(), - limiter: Ratelimit.slidingWindow( - Number(env.UPSTASH_RATELIMIT_REQUESTS), - `${Number(env.UPSTASH_RATELIMIT_SECONDS)}s` - ), - analytics: true, - }); - - const { success } = await rateLimit.limit( - `${env.APP_ENV}_${ctx.session.user.id}` - ); - if (!success) throw new TRPCError({ code: "TOO_MANY_REQUESTS" }); - - return next({ - ctx: { - session: { ...ctx.session, user: ctx.session.user }, - }, - }); - } catch { - return next({ - ctx: { - session: { ...ctx.session, user: ctx.session.user }, - }, - }); - } + return next({ + ctx: { + session: { ...ctx.session, user: ctx.session.user }, + }, + }); }); /**