From 0fca2e9f4ed9030ab47f8cf4f37ae97c71b77fb1 Mon Sep 17 00:00:00 2001 From: Mythie Date: Mon, 31 Jul 2023 13:53:55 +1000 Subject: [PATCH] fix: improve typesafety --- .env.example | 4 +++ packages/lib/next-auth/auth-options.ts | 45 ++++++++++++++------------ packages/lib/tsconfig.json | 5 +++ packages/tsconfig/process-env.d.ts | 3 ++ 4 files changed, 36 insertions(+), 21 deletions(-) create mode 100644 packages/lib/tsconfig.json diff --git a/.env.example b/.env.example index 3ce57722b..47dea109e 100644 --- a/.env.example +++ b/.env.example @@ -2,6 +2,10 @@ NEXTAUTH_URL="http://localhost:3000" NEXTAUTH_SECRET="secret" +# [[AUTH OPTIONAL]] +NEXT_PRIVATE_GOOGLE_CLIENT_ID="" +NEXT_PRIVATE_GOOGLE_CLIENT_SECRET="" + # [[APP]] NEXT_PUBLIC_SITE_URL="http://localhost:3000" NEXT_PUBLIC_APP_URL="http://localhost:3000" diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 827b3b624..a4bf1e631 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -2,7 +2,7 @@ import { PrismaAdapter } from '@next-auth/prisma-adapter'; import { compare } from 'bcrypt'; import { AuthOptions, Session, User } from 'next-auth'; import CredentialsProvider from 'next-auth/providers/credentials'; -import GoogleProvider from 'next-auth/providers/google'; +import GoogleProvider, { GoogleProfile } from 'next-auth/providers/google'; import { prisma } from '@documenso/prisma'; @@ -41,20 +41,20 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { } return { - id: String(user.id) as any, + id: Number(user.id), email: user.email, name: user.name, } satisfies User; }, }), - GoogleProvider({ + GoogleProvider({ clientId: process.env.NEXT_PRIVATE_GOOGLE_CLIENT_ID ?? '', clientSecret: process.env.NEXT_PRIVATE_GOOGLE_CLIENT_SECRET ?? '', allowDangerousEmailAccountLinking: true, profile(profile) { return { - id: profile.sub as any, - name: profile.name, + id: Number(profile.sub), + name: profile.name || `${profile.given_name} ${profile.family_name}`.trim(), email: profile.email, }; }, @@ -62,39 +62,42 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { ], callbacks: { async jwt({ token, user }) { - const dbUser = await prisma.user.findFirst({ + if (!token.email) { + throw new Error('No email in token'); + } + + const retrievedUser = await prisma.user.findFirst({ where: { - email: token.email as string, + email: token.email, }, }); - if (!dbUser) { - if (user) { - token.id = user?.id; - } - return token; + if (!retrievedUser) { + return { + ...token, + id: user.id, + }; } return { - id: dbUser.id, - name: dbUser.name, - email: dbUser.email, + id: retrievedUser.id, + name: retrievedUser.name, + email: retrievedUser.email, }; }, + async session({ token, session }) { - console.log('session', { token, session }); - if (token) { - const documensoSession = { + if (token && token.email) { + return { ...session, user: { id: Number(token.id), name: token.name, email: token.email, }, - } as Session; - - return documensoSession; + } satisfies Session; } + return session; }, }, diff --git a/packages/lib/tsconfig.json b/packages/lib/tsconfig.json new file mode 100644 index 000000000..4aefcb98c --- /dev/null +++ b/packages/lib/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@documenso/tsconfig/react-library.json", + "include": ["."], + "exclude": ["dist", "build", "node_modules"] +} diff --git a/packages/tsconfig/process-env.d.ts b/packages/tsconfig/process-env.d.ts index a6e1be1e2..8f8b6f108 100644 --- a/packages/tsconfig/process-env.d.ts +++ b/packages/tsconfig/process-env.d.ts @@ -2,6 +2,9 @@ declare namespace NodeJS { export interface ProcessEnv { NEXT_PUBLIC_SITE_URL?: string; + NEXT_PRIVATE_GOOGLE_CLIENT_ID?: string; + NEXT_PRIVATE_GOOGLE_CLIENT_SECRET?: string; + NEXT_PRIVATE_DATABASE_URL: string; NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID: string;