127 lines
4.0 KiB
TypeScript
127 lines
4.0 KiB
TypeScript
import NextAuth from "next-auth"
|
|
import Credentials from "next-auth/providers/credentials"
|
|
import { prisma } from "./prisma"
|
|
import bcrypt from "bcryptjs"
|
|
|
|
export const { handlers, signIn, signOut, auth } = NextAuth({
|
|
debug: process.env.NODE_ENV === "development",
|
|
providers: [
|
|
Credentials({
|
|
credentials: {
|
|
email: { label: "Email", type: "email" },
|
|
password: { label: "Password", type: "password" },
|
|
userType: { label: "User Type", type: "text" }
|
|
},
|
|
authorize: async (credentials) => {
|
|
try {
|
|
if (!credentials?.email || !credentials?.password || !credentials?.userType) {
|
|
console.log("Missing credentials")
|
|
return null
|
|
}
|
|
|
|
const email = credentials.email as string
|
|
const password = credentials.password as string
|
|
const userType = credentials.userType as string
|
|
|
|
console.log(`Attempting login for ${email} as ${userType}`)
|
|
|
|
if (userType === "admin") {
|
|
const admin = await prisma.admin.findUnique({ where: { email } })
|
|
if (!admin) {
|
|
console.log("Admin not found")
|
|
return null
|
|
}
|
|
const isValid = await bcrypt.compare(password, admin.password)
|
|
if (!isValid) {
|
|
console.log("Invalid admin password")
|
|
return null
|
|
}
|
|
console.log("Admin login successful")
|
|
return {
|
|
id: admin.id,
|
|
email: admin.email,
|
|
name: `${admin.firstName} ${admin.surname}`,
|
|
role: "admin"
|
|
}
|
|
} else if (userType === "shift_manager") {
|
|
const manager = await prisma.shiftManager.findFirst({ where: { email } })
|
|
if (!manager) {
|
|
console.log("Manager not found")
|
|
return null
|
|
}
|
|
if (!manager.password) {
|
|
console.log("Manager has no password")
|
|
return null
|
|
}
|
|
const isValid = await bcrypt.compare(password, manager.password)
|
|
if (!isValid) {
|
|
console.log("Invalid manager password")
|
|
return null
|
|
}
|
|
console.log("Manager login successful")
|
|
return {
|
|
id: manager.id,
|
|
email: manager.email || "",
|
|
name: `${manager.firstName} ${manager.surname}`,
|
|
role: "shift_manager",
|
|
empNo: manager.empNo
|
|
}
|
|
} else if (userType === "operator") {
|
|
const worker = await prisma.worker.findFirst({
|
|
where: {
|
|
email,
|
|
jobPosition: "Blow Moulder Level 1"
|
|
}
|
|
})
|
|
if (!worker) {
|
|
console.log("Operator not found")
|
|
return null
|
|
}
|
|
if (!worker.password) {
|
|
console.log("Operator has no password")
|
|
return null
|
|
}
|
|
const isValid = await bcrypt.compare(password, worker.password)
|
|
if (!isValid) {
|
|
console.log("Invalid operator password")
|
|
return null
|
|
}
|
|
console.log("Operator login successful")
|
|
return {
|
|
id: worker.id,
|
|
email: worker.email || "",
|
|
name: `${worker.firstName} ${worker.surname}`,
|
|
role: "operator",
|
|
empNo: worker.empNo
|
|
}
|
|
}
|
|
console.log("Unknown user type")
|
|
return null
|
|
} catch (error) {
|
|
console.error("Auth error:", error)
|
|
return null
|
|
}
|
|
},
|
|
}),
|
|
],
|
|
callbacks: {
|
|
jwt({ token, user }) {
|
|
if (user) {
|
|
token.role = user.role
|
|
token.empNo = user.empNo
|
|
}
|
|
return token
|
|
},
|
|
session({ session, token }) {
|
|
if (session.user) {
|
|
session.user.role = token.role as string
|
|
session.user.empNo = token.empNo as string
|
|
}
|
|
return session
|
|
},
|
|
},
|
|
pages: {
|
|
signIn: "/login",
|
|
},
|
|
})
|