94 lines
1.7 KiB
TypeScript
94 lines
1.7 KiB
TypeScript
"use server"
|
|
|
|
import { prisma } from "@/prisma/prisma-client"
|
|
|
|
|
|
|
|
export async function getStats() {
|
|
const [
|
|
totalAds,
|
|
activeAds,
|
|
totalUsers,
|
|
newUsers,
|
|
topCategories,
|
|
topCities
|
|
] = await Promise.all([
|
|
// Общее количество объявлений
|
|
prisma.adt.count(),
|
|
|
|
// Активные объявления
|
|
prisma.adt.count({
|
|
where: {
|
|
status: "PUBLISHED"
|
|
}
|
|
}),
|
|
|
|
// Общее количество пользователей
|
|
prisma.user.count(),
|
|
|
|
// Новые пользователи за последние 30 дней
|
|
prisma.user.count({
|
|
// where: {
|
|
// createdAt: {
|
|
// gte: addDays(new Date(), -30)
|
|
// }
|
|
// }
|
|
}),
|
|
|
|
// Топ категорий
|
|
prisma.category.findMany({
|
|
select: {
|
|
id: true,
|
|
nameEn: true,
|
|
_count: {
|
|
select: {
|
|
adts: true
|
|
}
|
|
}
|
|
},
|
|
orderBy: {
|
|
adts: {
|
|
_count: 'desc'
|
|
}
|
|
},
|
|
take: 5
|
|
}),
|
|
|
|
// Топ городов
|
|
prisma.city.findMany({
|
|
select: {
|
|
id: true,
|
|
nameEn: true,
|
|
_count: {
|
|
select: {
|
|
adts: true
|
|
}
|
|
}
|
|
},
|
|
orderBy: {
|
|
adts: {
|
|
_count: 'desc'
|
|
}
|
|
},
|
|
take: 5
|
|
})
|
|
])
|
|
|
|
return {
|
|
totalAds,
|
|
activeAds,
|
|
totalUsers,
|
|
newUsers,
|
|
topCategories: topCategories.map(cat => ({
|
|
id: cat.id,
|
|
name: cat.nameEn,
|
|
count: cat._count.adts
|
|
})),
|
|
topCities: topCities.map(city => ({
|
|
id: city.id,
|
|
name: city.nameEn,
|
|
count: city._count.adts
|
|
}))
|
|
}
|
|
}
|