From 166ca3da843d27b9afc326f8747aa663f01cc096 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji <88056492+atridadl@users.noreply.github.com> Date: Wed, 12 Jul 2023 12:27:39 -0600 Subject: [PATCH 1/5] session issues --- src/pages/room/[id].tsx | 282 ++++++++++++++++++++-------------------- 1 file changed, 140 insertions(+), 142 deletions(-) diff --git a/src/pages/room/[id].tsx b/src/pages/room/[id].tsx index 2d8794c..0787cbb 100644 --- a/src/pages/room/[id].tsx +++ b/src/pages/room/[id].tsx @@ -26,6 +26,7 @@ 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 +47,7 @@ export const getServerSideProps: GetServerSideProps = async (ctx) => { }; }; -const Room: NextPage = () => { +const Room: NextPage<{ session: Session }> = ({ session }) => { return ( <> @@ -55,7 +56,7 @@ const Room: NextPage = () => {
- +
); @@ -63,8 +64,7 @@ const Room: NextPage = () => { export default Room; -const RoomBody: React.FC = () => { - const { data: sessionData } = useSession(); +const RoomBody: React.FC<{ session: Session }> = ({ session }) => { const { query } = useRouter(); const roomId = z.string().parse(query.id); @@ -83,7 +83,7 @@ const RoomBody: React.FC = () => { configureAbly({ key: env.NEXT_PUBLIC_ABLY_PUBLIC_KEY, - clientId: sessionData?.user.id, + clientId: session.user.id, recover: (_, cb) => { cb(true); }, @@ -106,10 +106,10 @@ const RoomBody: React.FC = () => { const [presenceData] = usePresence( `${env.NEXT_PUBLIC_APP_ENV}-${roomId}`, { - name: sessionData?.user.name || "", - image: sessionData?.user.image || "", - client_id: sessionData?.user.id || "", - role: sessionData?.user.role || "USER", + name: session.user.name || "", + image: session.user.image || "", + client_id: session.user.id || "", + role: session.user.role || "USER", } ); @@ -126,18 +126,18 @@ const RoomBody: React.FC = () => { // Init story name useEffect(() => { - if (sessionData && roomFromDb) { + if (session && roomFromDb) { setStoryNameText(roomFromDb.storyName || ""); setRoomScale(roomFromDb.scale || "ERROR"); } - }, [roomFromDb, roomId, sessionData]); + }, [roomFromDb, roomId, session]); // Helper functions const getVoteForCurrentUser = () => { - if (roomFromDb && sessionData) { + if (roomFromDb && session) { return ( votesFromDb && - votesFromDb.find((vote) => vote.userId === sessionData.user.id) + votesFromDb.find((vote) => vote.userId === session.user.id) ); } else { return null; @@ -224,7 +224,7 @@ const RoomBody: React.FC = () => { if (visible) { if (!!matchedVote) { - return

{ matchedVote.value }

; + return

{matchedVote.value}

; } else { return ; } @@ -243,39 +243,39 @@ const RoomBody: React.FC = () => { if (roomFromDb === undefined) { return (
- { " " } + {" "}
); // Room has been loaded } else if (roomFromDb) { return ( -
{ roomFromDb.roomName }
+
{roomFromDb.roomName}
ID:
-
{ roomFromDb.id }
+
{roomFromDb.id}
- { roomFromDb && ( + {roomFromDb && (

- Story: { roomFromDb.storyName } + Story: {roomFromDb.storyName}

    - { presenceData && + {presenceData && presenceData .filter( (value, index, self) => @@ -288,176 +288,174 @@ const RoomBody: React.FC = () => { .map((presenceItem) => { return (
  • {

    - { presenceItem.data.name }{ " " } - { presenceItem.data.role === "ADMIN" && ( + {presenceItem.data.name}{" "} + {presenceItem.data.role === "ADMIN" && (

    - ) }{ " " } - { presenceItem.clientId === roomFromDb.userId && ( + )}{" "} + {presenceItem.clientId === roomFromDb.userId && (
    - ) } - { " : " } + )} + {" : "}

    - { roomFromDb && + {roomFromDb && votesFromDb && voteString( roomFromDb.visible, votesFromDb, presenceItem.data - ) } + )}
  • ); - }) } + })}
- { roomFromDb.scale.split(",").map((scaleItem, index) => { + {roomFromDb.scale.split(",").map((scaleItem, index) => { return ( ); - }) } + })}
- ) } + )} - { sessionData && - !!roomFromDb && - roomFromDb.userId === sessionData.user.id && ( - <> -
-
-

Room Settings

+ {session && !!roomFromDb && roomFromDb.userId === session.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) && ( -
- -
- ) } +
+
+
+ +
+ +
+ + {votesFromDb && + (roomFromDb.logs.length > 0 || votesFromDb.length > 0) && ( +
+ +
+ )}
- - ) } +
+ + )} ); // Room does not exist From dfdd82af04bbd4b89db80ec7333ccccde697f7ad Mon Sep 17 00:00:00 2001 From: Atridad Lahiji <88056492+atridadl@users.noreply.github.com> Date: Wed, 12 Jul 2023 12:30:58 -0600 Subject: [PATCH 2/5] Fixes --- src/pages/room/[id].tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/room/[id].tsx b/src/pages/room/[id].tsx index 0787cbb..3a2e6c4 100644 --- a/src/pages/room/[id].tsx +++ b/src/pages/room/[id].tsx @@ -3,7 +3,6 @@ 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, From 7417ae402380570441c7a0b0bf854586c129ba11 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 3/5] 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 }, + }, + }); }); /** From 26348b896daf0036ea3c3a9b03f90c1abb05194b Mon Sep 17 00:00:00 2001 From: Atridad Lahiji <88056492+atridadl@users.noreply.github.com> Date: Wed, 12 Jul 2023 12:41:34 -0600 Subject: [PATCH 4/5] lockfile --- pnpm-lock.yaml | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c29d14..a63418b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,9 +32,6 @@ dependencies: '@trpc/server': specifier: 10.34.0 version: 10.34.0 - '@upstash/ratelimit': - specifier: ^0.4.3 - version: 0.4.3 '@upstash/redis': specifier: ^1.22.0 version: 1.22.0 @@ -1351,23 +1348,6 @@ packages: eslint-visitor-keys: 3.4.1 dev: true - /@upstash/core-analytics@0.0.6: - resolution: {integrity: sha512-cpPSR0XJAJs4Ddz9nq3tINlPS5aLfWVCqhhtHnXt4p7qr5+/Znlt1Es736poB/9rnl1hAHrOsOvVj46NEXcVqA==} - engines: {node: '>=16.0.0'} - dependencies: - '@upstash/redis': 1.22.0 - transitivePeerDependencies: - - encoding - dev: false - - /@upstash/ratelimit@0.4.3: - resolution: {integrity: sha512-Dsp9Mw09Flg28JRklKgFiCXqr3bqv8bbG0kgpUYoHjcgPPolFFyaYOj/I2HExvYLZiogl77NUavBoNvMOK0zUQ==} - dependencies: - '@upstash/core-analytics': 0.0.6 - transitivePeerDependencies: - - encoding - dev: false - /@upstash/redis@1.22.0: resolution: {integrity: sha512-sXoJDoEqqik0HbrNE7yRWckOySEFsoBxfRdCgOqkc0w6py19ZZG50SpGkDDEUXSnBqP8VgGYXhWAiBpqxrt5oA==} dependencies: From 90606df040bd9a4b309b601eb25cf726d1d4f3bc Mon Sep 17 00:00:00 2001 From: Atridad Lahiji <88056492+atridadl@users.noreply.github.com> Date: Wed, 12 Jul 2023 12:43:49 -0600 Subject: [PATCH 5/5] whoopsie --- src/server/api/trpc.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index d6f73c4..07c0c41 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -17,7 +17,6 @@ import { type CreateNextContextOptions } from "@trpc/server/adapters/next"; import { type Session } from "next-auth"; -import { Redis } from "@upstash/redis"; import { getServerAuthSession } from "~/server/auth"; import { prisma } from "~/server/db"; @@ -66,7 +65,6 @@ export const createTRPCContext = async (opts: CreateNextContextOptions) => { */ import { initTRPC, TRPCError } from "@trpc/server"; import superjson from "superjson"; -import { env } from "~/env.mjs"; const t = initTRPC.context().create({ transformer: superjson,