All files / src/lib/auth auth.ts

100% Statements 10/10
100% Branches 10/10
100% Functions 1/1
100% Lines 10/10

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61              5x                     5x 1x       4x           4x 1x       3x         3x 1x       2x                                
import bcrypt from 'bcrypt';
import NextAuth from 'next-auth';
import Credentials from 'next-auth/providers/credentials';
import { prisma } from '@/lib/prisma/prisma';
import type { Locale } from '@/types/common';
import { authConfig } from './auth.config';
 
export const { handlers, signIn, signOut, auth } = NextAuth({
  ...authConfig,
  providers: [
    Credentials({
      name: 'Credentials',
      credentials: {
        email: { label: 'Email', type: 'email' },
        password: { label: 'Password', type: 'password' },
        rememberMe: { label: 'Remember Me', type: 'checkbox' },
      },
      async authorize(credentials) {
        if (!credentials?.email || !credentials?.password) {
          throw new Error('Email and password are required');
        }
 
        // Find user by email
        const user = await prisma.user.findUnique({
          where: {
            email: credentials.email as string,
          },
        });
 
        if (!user) {
          throw new Error('Invalid email or password');
        }
 
        // Verify password
        const isPasswordValid = await bcrypt.compare(
          credentials.password as string,
          user.password,
        );
 
        if (!isPasswordValid) {
          throw new Error('Invalid email or password');
        }
 
        // Return user object that will be stored in session
        return {
          id: user.id,
          email: user.email,
          firstName: user.firstName,
          lastName: user.lastName,
          userName: user.userName,
          role: user.role,
          locale: user.locale as Locale,
          rememberMe:
            credentials.rememberMe === 'true' ||
            credentials.rememberMe === 'on',
        };
      },
    }),
  ],
});