JavaScript 56.7%
TypeScript 42.6%
1import bcrypt from "bcryptjs";2import { prisma } from "./prisma";34export async function verifyPassword(password: string, username?: string): Promise<{ valid: boolean; user: { id: string; role: string; twoFactorEnabled: boolean } | null }> {5 let user;6 if (username) {7 user = await prisma.user.findFirst({8 where: { OR: [{ username }, { email: username }] },9 });10 if (!user) return { valid: false, user: null };11 const valid = await bcrypt.compare(password, user.passwordHash);12 return { valid, user: valid ? { id: user.id, role: user.role, twoFactorEnabled: user.twoFactorEnabled } : null };13 }1415 // Fallback: single user / password-only login16 const users = await prisma.user.findMany();17 for (const u of users) {18 const match = await bcrypt.compare(password, u.passwordHash);19 if (match) {20 return { valid: true, user: { id: u.id, role: u.role, twoFactorEnabled: u.twoFactorEnabled } };21 }22 }23 return { valid: false, user: null };24}2526export async function hashPassword(password: string): Promise<string> {27 return bcrypt.hash(password, 12);28}2930export async function getUserById(userId: string) {31 return prisma.user.findUnique({32 where: { id: userId },33 select: { id: true, email: true, name: true, role: true, twoFactorEnabled: true, createdAt: true },34 });35}3637export async function requireAdmin(userId: string): Promise<boolean> {38 const user = await prisma.user.findUnique({ where: { id: userId } });39 return user?.role === "admin";40}41