+ {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) && (
-
-
-
- >
- )}
+ >
+ )}
);
// 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,