muller-reporting-sys/lib/auth.ts
2025-11-12 22:21:35 +03:00

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",
},
})