diff --git a/apps/web/src/auth.ts b/apps/web/src/auth.ts index 0ee18d735..bd72017d3 100644 --- a/apps/web/src/auth.ts +++ b/apps/web/src/auth.ts @@ -24,7 +24,7 @@ import { getValueByPath } from "@/utils/get-value-by-path"; import { decryptToken } from "@/utils/session"; import { CustomPrismaAdapter } from "./auth/custom-prisma-adapter"; -import { mergeGuestsIntoUser } from "./auth/merge-user"; +import { mergeGuestsIntoUser, temporarilyMigrateData } from "./auth/merge-user"; const providers: Provider[] = [ // When a user registers, we don't want to go through the email verification process @@ -242,7 +242,20 @@ const getAuthOptions = (...args: GetServerSessionParams) => // merge guest user into newly logged in user const session = await getServerSession(...args); if (session && session.user.email === null) { - await mergeGuestsIntoUser(user.id, [session.user.id]); + // check if user exists + const count = await prisma.user.count({ + where: { + email: user.email as string, + }, + }); + + if (count !== 0) { + await mergeGuestsIntoUser(user.id, [session.user.id]); + } else { + // when logging in with a social account, the user doesn't exist yet + // so we temporarily migrate the data to a different guest user. + await temporarilyMigrateData(user.id, [session.user.id]); + } } } diff --git a/apps/web/src/auth/merge-user.ts b/apps/web/src/auth/merge-user.ts index 9262f89a0..ac4405175 100644 --- a/apps/web/src/auth/merge-user.ts +++ b/apps/web/src/auth/merge-user.ts @@ -44,3 +44,45 @@ export const mergeGuestsIntoUser = async ( ]); }); }; + +export const temporarilyMigrateData = async ( + providerId: string, + guestIds: string[], +) => { + return await prisma.$transaction(async (tx) => { + await Promise.all([ + tx.poll.updateMany({ + where: { + guestId: { + in: guestIds, + }, + }, + data: { + guestId: providerId, + }, + }), + + tx.participant.updateMany({ + where: { + guestId: { + in: guestIds, + }, + }, + data: { + guestId: providerId, + }, + }), + + tx.comment.updateMany({ + where: { + guestId: { + in: guestIds, + }, + }, + data: { + guestId: providerId, + }, + }), + ]); + }); +};