feat: basic admin interface

This commit is contained in:
Zoe
2026-10-08 13:41:02 -05:00
parent 7b0800882a
commit f6e1bc1f47
27 changed files with 4095 additions and 49 deletions
+39
View File
@@ -0,0 +1,39 @@
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,
}));
});