-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauth.ts
More file actions
130 lines (114 loc) · 2.78 KB
/
auth.ts
File metadata and controls
130 lines (114 loc) · 2.78 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import NextAuth, { NextAuthConfig } from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
import { PrismaAdapter } from "@auth/prisma-adapter";
import { prisma } from "@/db/prisma";
import { compareSync } from "bcrypt-ts-edge";
import { cookies } from "next/headers";
export const config: NextAuthConfig = {
pages: {
signIn: "/sign-in",
error: "/sign-in",
},
session: {
strategy: "jwt",
maxAge: 30 * 24 * 60 * 60, // 30 days
},
adapter: PrismaAdapter(prisma),
trustHost: true,
providers: [
CredentialsProvider({
name: "Credentials",
credentials: {
email: { label: "Email", type: "email" },
password: { label: "Password", type: "password" },
},
async authorize(credentials) {
if (!credentials) return null;
const user = await prisma.user.findFirst({
where: {
email: credentials.email as string,
},
});
if (!user) {
throw new Error("No user found with the given email");
}
if (user && user.password) {
const isMatch = compareSync(
credentials.password as string,
user.password
);
if (isMatch)
return {
id: user.id,
name: user.name,
email: user.email,
role: user.role,
};
}
return null;
},
}),
],
callbacks: {
async session({ session, token, user, trigger }: any) {
session.user.id = token.sub;
session.user.role = token.role;
session.user.name = token.name;
if (trigger === "update") {
session.user.name = user.name;
}
return session;
},
async jwt({ token, user, trigger, session }: any) {
if (user) {
token.role = user.role;
token.id = user.id;
if (user.name === "NO_NAME") {
token.name = user.email!.split("@")[0];
}
await prisma.user.update({
where: {
id: user.id,
},
data: {
name: token.name,
},
});
if (trigger === "signIn" || trigger === "signup") {
const cookiesObj = await cookies();
const sessionCartId = cookiesObj.get("sessionCartId")?.value;
if (sessionCartId) {
const sessionCart = await prisma.cart.findFirst({
where: {
sessionCartId,
},
});
if (sessionCart) {
// Delete current user cart
await prisma.cart.deleteMany({
where: {
userId: user.id,
},
});
// create a new cart for the user using the current session cart
await prisma.cart.update({
where: {
id: sessionCart.id,
},
data: {
userId: user.id,
},
});
}
}
}
}
// Handle session udpates
if (trigger === "update" && session?.user.name) {
token.name = session.user.name;
}
return token;
},
},
};
export const { handlers, auth, signIn, signOut } = NextAuth(config);