import { eq, inArray } from "drizzle-orm"; import { database } from "~/database/context"; import * as schema from "~/database/schema"; export type User = typeof schema.users.$inferSelect; export type NewUser = typeof schema.users.$inferInsert; export function getUserDisplayName( user: Pick ): string | null { return user.username ?? user.displayName ?? null; } export async function createUser(data: NewUser): Promise { const db = database(); const [user] = await db.insert(schema.users).values(data).returning(); return user; } export async function findUserById(id: string): Promise { const db = database(); return await db.query.users.findFirst({ where: eq(schema.users.id, id), }); } export async function findUsersByIds(ids: string[]): Promise { if (ids.length === 0) return []; const db = database(); return await db .select() .from(schema.users) .where(inArray(schema.users.id, ids)); } export async function updateUser( id: string, data: Partial ): Promise { const db = database(); const [user] = await db .update(schema.users) .set({ ...data, updatedAt: new Date() }) .where(eq(schema.users.id, id)) .returning(); return user; } export async function deleteUser(id: string): Promise { const db = database(); await db.delete(schema.users).where(eq(schema.users.id, id)); } export async function findAdmins(): Promise { const db = database(); return await db.query.users.findMany({ where: eq(schema.users.isAdmin, true), orderBy: (users, { asc }) => [asc(users.displayName)], }); } export async function isUserAdmin(userId: string): Promise { const user = await findUserById(userId); return user?.isAdmin ?? false; } export async function setUserAdmin(userId: string, isAdmin: boolean): Promise { return await updateUser(userId, { isAdmin }); } export async function findAllUsers(): Promise { const db = database(); return await db.query.users.findMany({ orderBy: (users, { asc }) => [asc(users.displayName)], }); }