import { asc, eq, max } from 'drizzle-orm'; import { sessions, users } from '~~/drizzle/schema'; import { db } from '~~/server/lib/db'; /** * Every account of the instance, for the admin user list. * * Only what is needed to manage accounts is returned. Chats, agents, files and * API keys of other users are never part of this. */ export default defineEventHandler(async (event) => { await protectAdminRoute(event); const rows = await db .select({ id: users.id, name: users.name, email: users.email, image: users.image, role: users.role, banned: users.banned, twoFactorEnabled: users.twoFactorEnabled, createdAt: users.createdAt, // sessions are touched as they are used, the newest one is the // closest thing there is to a last seen time lastActiveAt: max(sessions.updatedAt), }) .from(users) .leftJoin(sessions, eq(sessions.userId, users.id)) .groupBy(users.id) .orderBy(asc(users.createdAt)); return rows.map((row) => ({ ...row, role: row.role === 'admin' ? 'admin' as const : 'user' as const, banned: !!row.banned, twoFactorEnabled: !!row.twoFactorEnabled, })); });