import { desc, eq, sql } from "drizzle-orm"; import { users } from "@app/models"; import { db } from "@app/db"; export type UserRow = typeof users.$inferSelect; export interface ListUsersParams { limit: number; offset: number; } export const userDao = { async list(params: ListUsersParams): Promise<{ rows: UserRow[]; total: number }> { const rows = await db .select() .from(users) .orderBy(desc(users.createdAt)) .limit(params.limit) .offset(params.offset); const [countRow] = await db.select({ count: sql`count(*)` }).from(users); return { rows, total: Number(countRow?.["count"] ?? 0) }; }, async getById(id: string): Promise { const [row] = await db.select().from(users).where(eq(users.id, id)).limit(1); return row ?? null; }, async getByEmail(email: string): Promise { const [row] = await db .select() .from(users) .where(eq(users.email, email.toLowerCase())) .limit(1); return row ?? null; }, async create( data: Omit & { id?: string }, ): Promise { const payload = { ...data, email: data.email.toLowerCase() }; const rows = await db.insert(users).values(payload).returning(); const row = rows[0]; if (!row) throw new Error("Failed to create user"); return row; }, async update( id: string, data: Partial>, ): Promise { const payload: Partial> = { ...data }; if (payload.email !== undefined) payload.email = payload.email.toLowerCase(); const [row] = await db .update(users) .set({ ...payload, updatedAt: new Date() }) .where(eq(users.id, id)) .returning(); return row ?? null; }, async delete(id: string): Promise { await db.delete(users).where(eq(users.id, id)); }, };