From 78e3defd631524efddb783285a66d6de7576948c Mon Sep 17 00:00:00 2001 From: Hassan El Mghari Date: Thu, 9 Mar 2023 21:00:45 -0500 Subject: [PATCH] auth fixes, ran prisma migration --- README.md | 11 ++ pages/api/auth/[...nextauth].ts | 1 - pages/api/generate.ts | 4 +- pages/api/remaining.ts | 15 ++- pages/dream.tsx | 111 ++++++++---------- .../20230310013453_initial/migration.sql | 66 +++++++++++ prisma/migrations/migration_lock.toml | 3 + 7 files changed, 143 insertions(+), 68 deletions(-) create mode 100644 prisma/migrations/20230310013453_initial/migration.sql create mode 100644 prisma/migrations/migration_lock.toml diff --git a/README.md b/README.md index c322e821..9c2f905a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +## Todos left for auth + +- test it on deployment URL, make sure reset time is real +- roll it out to prod with instant rollback + # [roomGPT.io](https://roomGPT.io) This project generates new designs of your room with AI. @@ -46,6 +51,12 @@ npm run dev 1. Use `openssl rand -base64 32` to generate NEXTAUTH_SECRET 2. Add DB URL and SHADOW DB URL from Neon +3. Create a new project in console.cloud.google.com +4. Click configure consent screen in API credentials page and click external +5. Add an app name, do not upload logo, add authorized domain +6. Publish app +7. Create credentials -> Oauth client ID +8. Run npx prisma db push && prisma migrate dev && prisma generate ## One-Click Deploy diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index 45963e51..b2d47412 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -4,7 +4,6 @@ import { PrismaAdapter } from "@next-auth/prisma-adapter"; import prisma from "../../../lib/prismadb"; export const authOptions: NextAuthOptions = { - debug: true, adapter: PrismaAdapter(prisma), providers: [ GoogleProvider({ diff --git a/pages/api/generate.ts b/pages/api/generate.ts index 8d676734..1105ef7e 100644 --- a/pages/api/generate.ts +++ b/pages/api/generate.ts @@ -19,11 +19,11 @@ interface ExtendedNextApiRequest extends NextApiRequest { }; } -// Create a new ratelimiter, that allows 3 requests per 24 hours +// Create a new ratelimiter, that allows 5 requests per 24 hours const ratelimit = redis ? new Ratelimit({ redis: redis, - limiter: Ratelimit.fixedWindow(3, "1440 m"), + limiter: Ratelimit.fixedWindow(5, "1440 m"), analytics: true, }) : undefined; diff --git a/pages/api/remaining.ts b/pages/api/remaining.ts index 667a9cd4..9301ebba 100644 --- a/pages/api/remaining.ts +++ b/pages/api/remaining.ts @@ -21,11 +21,18 @@ export default async function handler( const usedGenerations = (await redis?.get(`@upstash/ratelimit:${identifier!}:${bucket}`)) || 0; - // it can return null and it also returns the number of generations the user has done, not the number they have left - - // TODO: Move this using date-fns on the client-side + // Move this using date-fns on the client-side const resetDate = new Date(); - resetDate.setHours(19, 0, 0, 0); + // Check if the current time is before 7pm EST + if (resetDate.getUTCHours() < 23) { + // 23 is equivalent to 7pm EST in UTC + // If before 7pm EST, set the time to 7pm EST + resetDate.setUTCHours(19, 0, 0, 0); + } else { + // If after 7pm EST, add one day and set the time to 7pm EST + resetDate.setDate(resetDate.getDate() + 1); // Add one day + resetDate.setUTCHours(19, 0, 0, 0); + } const diff = Math.abs(resetDate.getTime() - new Date().getTime()); const hours = Math.floor(diff / 1000 / 60 / 60); const minutes = Math.floor(diff / 1000 / 60) - hours * 60; diff --git a/pages/dream.tsx b/pages/dream.tsx index f5579ee3..4e1da8ec 100644 --- a/pages/dream.tsx +++ b/pages/dream.tsx @@ -80,7 +80,7 @@ const Home: NextPage = () => { ); async function generatePhoto(fileUrl: string) { - await new Promise((resolve) => setTimeout(resolve, 200)); // TODO: See if I even need this + await new Promise((resolve) => setTimeout(resolve, 200)); setLoading(true); const res = await fetch("/api/generate", { method: "POST", @@ -95,6 +95,7 @@ const Home: NextPage = () => { if (res.status !== 200) { setError(response as any); } else { + mutate(); const rooms = (JSON.parse(localStorage.getItem("rooms") || "[]") as string[]) || []; rooms.push(response.id); @@ -114,44 +115,70 @@ const Home: NextPage = () => {
- Subscribe to my newsletter to - learn how I built roomGPT + 728,000 rooms generated and + counting

Generate your dream room

- {status === "authenticated" && data && ( -

+ {status === "authenticated" && data && !restoredImage && ( +

You have{" "} - + {data.remainingGenerations} generations {" "} left today. Your generation {Number(data.remainingGenerations) > 1 ? "s" : ""} will renew in{" "} - + {data.hours} hours and {data.minutes} minutes.

)} - {/* {!restoredImage && ( -

- Note: We're - temporarily{" "} - - limiting generations to 3 per day - {" "} - because of high traffic. -

- )} */} - {!restoredImage && ( + {restoredImage && ( +
+ Here's your remodeled {room.toLowerCase()} in the{" "} + {theme.toLowerCase()} theme!{" "} +
+ )} +
+ setSideBySide(newVal)} + /> +
+ {restoredLoaded && sideBySide && ( + + )} + {status === "loading" ? ( +
+ +
+ ) : status === "authenticated" && !originalPhoto ? ( <>
@@ -204,53 +231,15 @@ const Home: NextPage = () => {

+ - )} - {restoredImage && ( -
- Here's your remodeled {room.toLowerCase()} in the{" "} - {theme.toLowerCase()} theme!{" "} -
- )} -
- setSideBySide(newVal)} - /> -
- {restoredLoaded && sideBySide && ( - - )} - {status === "loading" ? ( -
- -
- ) : status === "authenticated" && !originalPhoto ? ( - ) : ( !originalPhoto && (
-
+
Sign in below with Google to create a free account and - restore your photos today. You will be able to restore 5 - photos per day for free. + redesign your room today. You will be able to do 5 + redesigns per day for free.