Files
veridian/server/api/admin/users/index.get.ts
T

40 lines
1.3 KiB
TypeScript

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,
}));
});