48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { requireAuth } from '~/server/utils/auth'
|
|
import { prisma } from '~/server/utils/prisma'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const user = requireAuth(event)
|
|
console.log(`[Admin API] Request from user: ${user.email}, Role: ${user.role}`)
|
|
|
|
if (user.role !== 'admin') {
|
|
throw createError({ statusCode: 403, message: 'Admin access required' })
|
|
}
|
|
|
|
// 1. Получаем список всех пользователей с их профилями
|
|
const usersList = await prisma.user.findMany({
|
|
include: { profile: true }
|
|
})
|
|
|
|
// 2. Получаем список всех канвасов
|
|
const canvasesList = await prisma.canvas.findMany({
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
nodes: true,
|
|
updatedAt: true,
|
|
ownerId: true
|
|
}
|
|
})
|
|
|
|
// 3. Считаем общее кол-во пушей (если есть таблица)
|
|
let pushCount = 0
|
|
try {
|
|
pushCount = await prisma.pushSubscription.count()
|
|
} catch (e) {}
|
|
|
|
return {
|
|
users: usersList,
|
|
canvases: canvasesList.map(c => ({
|
|
...c,
|
|
nodeCount: (c.nodes as any[])?.length || 0
|
|
})),
|
|
stats: {
|
|
users: usersList.length,
|
|
canvases: canvasesList.length,
|
|
nodes: canvasesList.reduce((sum, c) => sum + ((c.nodes as any[])?.length || 0), 0),
|
|
pushes: pushCount
|
|
}
|
|
}
|
|
})
|