SPB Git forge

spb/spb-cloud

Public
10commits 1branches 0releases
3.2 MBsize
maindefault branch
1 h agolast push
JavaScript 56.7% TypeScript 42.6%
1.5 KB · 41 lines typescript
Raw Blame History
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