import type { User } from "@prisma/client"; import { isNil, omit } from "lodash"; import db from "@/libs/db/prismaClient"; import { hashPassword, verifyPassword } from "@/libs/password"; import type { createUserType } from "./type"; export async function getUserByEmail( email: string, ): Promise | null> { const user = await db.user.findFirst({ where: { email }, select: { id: true, email: true, username: true, password: true, }, }); if (isNil(user)) return null; return user; } export async function getUserById(id: string): Promise { const user = await db.user.findUnique({ where: { id } }); return user; } export async function getUserByusername( username: string, ): Promise { return await db.user.findFirst({ where: { username } }); } export async function createUser( data: createUserType, ): Promise> { const { username, email, password } = data; const user = await db.user.create({ data: { email, password: hashPassword(password), username, }, }); return omit(user, ["password"]); } export async function ValidateUser( credential: string, password: string, ): Promise< | { success: false; message: string; user: null } | { success: true; message: string; user: { id: string; email: string; username: string; role: "ADMIN" | "USER"; createdAt: Date; updatedAt: Date; }; } > { const user = await db.user.findFirst({ where: { OR: [{ email: credential }, { username: credential }], }, select: { id: true, email: true, username: true, role: true, password: true, createdAt: true, updatedAt: true, }, }); if (isNil(user)) { return { success: false, message: "用戶不存在", user: null, }; } const ispasswordValid = verifyPassword(password, user.password); if (!ispasswordValid) { return { success: false, message: "密碼錯誤", user: null, }; } return { success: true, message: "登入成功", user: omit(user, ["password"]), }; } export async function uniqueEmailValidator(email: string): Promise { if (isNil(email)) return true; const user = await getUserByEmail(email); if (isNil(user)) return true; return false; } export async function uniqueUsernameValidator( username: string, ): Promise { if (isNil(username)) return true; const user = await getUserByusername(username); if (isNil(user)) return true; return false; }