MIF_E31220277/denta-api/auth.ts

70 lines
1.7 KiB
TypeScript

import NextAuth from "next-auth";
import authConfig from '@/auth.config';
import { PrismaClient } from '@/prisma/generated/client';
import { getUserById, genUsername } from "./helpers/user";
import { Role } from "@/config/enum";
import db from "@/lib/db";
const prisma = new PrismaClient({
log: ["error"],
});
export const { auth, handlers, signIn, signOut } = NextAuth({
// adapter: PrismaAdapter(prisma),
callbacks: {
async signIn({ user, account }) {
// Allow OAuth without email verification
if (account?.provider !== 'credentials') return true;
if (!user.id) throw new Error('User not found');
const existingUser = await getUserById(user.id);
if (!existingUser?.emailVerified) return false;
return true;
},
async session({ token, session }) {
// console.log("session", session, "token", token);
if (token.sub && session.user) {
session.user.id = token.sub;
session.user.name = token.name;
}
if (token.role && session.user) {
session.user.role = token.role as Role;
}
return session;
},
async jwt({ token }) {
if (!token.sub) return token;
const existingUser = await getUserById(token.sub);
if (!existingUser) return token;
const name = await genUsername(
existingUser.givenName,
existingUser.familyName
);
if (existingUser) {
token.role = existingUser.role;
}
if (token.isNewUser && !existingUser.name) {
token.name = name;
} else {
token.name = existingUser.name;
}
console.log('token', token);
return token;
},
},
...authConfig,
secret: process.env.AUTH_SECRET,
debug: true,
});