-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathuser.server.ts
45 lines (38 loc) · 1.2 KB
/
user.server.ts
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
import bcrypt from 'bcryptjs'
import { eq } from 'drizzle-orm'
import { db } from '~/db/db.server'
import { passwords, users, type Password, type User } from '~/db/schema'
export type { User }
export async function getUserById(id: User['id']): Promise<User | undefined> {
return db.query.users.findFirst({ where: eq(users.id, id) })
}
export async function getUserByEmail(
email: User['email'],
): Promise<User | undefined> {
return db.query.users.findFirst({ where: eq(users.email, email) })
}
export async function createUser({
email,
password,
}: {
email: User['email']
password: string
}): Promise<User> {
let hash = bcrypt.hash(password, 10)
let user = await db.insert(users).values({ email }).returning().get()
await db.insert(passwords).values({ userId: user.id, hash: await hash })
return user
}
export async function verifyLogin(
email: User['email'],
password: Password['hash'],
): Promise<User | null> {
let user = await db.query.users.findFirst({
where: eq(users.email, email),
with: { password: true },
})
if (!user) return null
if (!bcrypt.compareSync(password, user.password.hash)) return null
let { password: _, ...sanitizedUser } = user
return sanitizedUser
}