57 lines
1.4 KiB
TypeScript
57 lines
1.4 KiB
TypeScript
import { type AuthUser } from "~/lib/auth.server"
|
|
import { prismaRead, prismaWrite } from "~/lib/db.server"
|
|
import { createGate } from "~/lib/gate.server"
|
|
|
|
export const userModel = {
|
|
async updateProfile(
|
|
user: AuthUser | null | undefined,
|
|
payload: {
|
|
name?: string
|
|
username?: string
|
|
avatar?: string
|
|
bio?: string
|
|
email?: string
|
|
}
|
|
) {
|
|
const gate = createGate({ user, requireAuth: true })
|
|
if (payload.email) {
|
|
const userByEmail = await prismaRead.user.findUnique({
|
|
where: {
|
|
email: payload.email,
|
|
},
|
|
})
|
|
if (userByEmail && userByEmail.id !== gate.user.id) {
|
|
throw new Error("email already in use")
|
|
}
|
|
}
|
|
|
|
if (payload.username) {
|
|
const userByUsername = await prismaRead.user.findUnique({
|
|
where: {
|
|
username: payload.username,
|
|
},
|
|
})
|
|
if (userByUsername && userByUsername.id !== gate.user.id) {
|
|
throw new Error("username already in use")
|
|
}
|
|
}
|
|
|
|
const updated = await prismaWrite.user.update({
|
|
where: {
|
|
id: gate.user.id,
|
|
},
|
|
data: {
|
|
name: payload.name,
|
|
avatar: payload.avatar,
|
|
username: payload.username,
|
|
email: payload.email,
|
|
emailVerified: payload.email !== gate.user.email ? null : undefined,
|
|
},
|
|
})
|
|
|
|
return {
|
|
updated,
|
|
}
|
|
},
|
|
}
|