36 lines
1.1 KiB
TypeScript
36 lines
1.1 KiB
TypeScript
import { count, desc, eq } from "drizzle-orm"
|
|
import { db } from "../drizzle/db"
|
|
import { urls, visits } from "../drizzle/schema"
|
|
|
|
export async function getDashboardStats() {
|
|
try {
|
|
const [urlsCount] = await db.select({ count: count() }).from(urls)
|
|
const [visitsCount] = await db.select({ count: count() }).from(visits)
|
|
const mostVisitedUrl = await db
|
|
.select({
|
|
id: urls.id,
|
|
title: urls.title,
|
|
slug: urls.slug,
|
|
visitCount: count(visits.id)
|
|
})
|
|
.from(urls)
|
|
.leftJoin(visits, eq(urls.id, visits.urlId))
|
|
.groupBy(urls.id, urls.title, urls.slug)
|
|
.orderBy(desc(count(visits.id)))
|
|
.limit(1)
|
|
|
|
return {
|
|
totalUrls: urlsCount.count,
|
|
totalVisits: visitsCount.count,
|
|
mostVisitedUrl: mostVisitedUrl[0] || null
|
|
}
|
|
} catch (error) {
|
|
console.error("Failed to fetch dashboard stats:", error)
|
|
return {
|
|
totalUrls: 0,
|
|
totalVisits: 0,
|
|
mostVisitedUrl: null
|
|
}
|
|
}
|
|
}
|