import { IdentityContext } from '@app/server/identity'; import { prisma } from '@app/server/prisma/client'; import { MutationLoginArgs, Session } from '@generated/types'; import bcrypt from 'bcrypt'; import jwt from 'jsonwebtoken'; export async function LoginResolver( _: any, { input }: MutationLoginArgs, { identity }: IdentityContext ): Promise { const error = 'Invalid password or email'; const user = await prisma.user.findUnique({ where: { email: input.email } }); if (user == null) throw new Error(error); const match = await bcrypt.compare(input.password, user.password); if (!match) throw new Error(error); const accessTokenSecret = process.env.ACCESS_TOKEN_SECRET; const refreshTokenSecret = process.env.REFRESH_TOKEN_SECRET; if (accessTokenSecret == null || refreshTokenSecret == null) throw new Error('No secrets found'); const accessToken = jwt.sign({ userId: user.id }, accessTokenSecret, { expiresIn: '30s' }); const refreshToken = jwt.sign({ userId: user.id }, refreshTokenSecret, { expiresIn: '1d' }); await prisma.user.update({ where: { id: user.id }, data: { refreshToken } }); return { accessToken, refreshToken: { token: refreshToken, httpOnly: true, secure: true, maxAge: 24 * 60 * 60 * 1000, sameSite: 'None' } }; }