mirror of
https://gitlab.com/PronounsPage/PronounsPage.git
synced 2025-09-27 06:52:35 -04:00
70 lines
2.3 KiB
TypeScript
70 lines
2.3 KiB
TypeScript
import { fetchStats } from '~~/server/admin.ts';
|
|
import { getLocale } from '~~/server/data.ts';
|
|
|
|
interface PublicStats {
|
|
calculatedAt: number;
|
|
overall: PublicLocaleStats;
|
|
current: Partial<PublicLocaleStats>;
|
|
}
|
|
|
|
interface PublicLocaleStats {
|
|
users: number;
|
|
cards: number;
|
|
pageViews: number;
|
|
visitors: number;
|
|
online: number;
|
|
visitDuration?: number;
|
|
uptime?: number;
|
|
responseTime?: number;
|
|
}
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const requestedLocale = getLocale(event);
|
|
const db = useDatabase();
|
|
const statsAll = await fetchStats(db);
|
|
if (statsAll === null) {
|
|
throw createError({
|
|
status: 404,
|
|
statusMessage: 'Not Found',
|
|
});
|
|
}
|
|
|
|
const stats: PublicStats = {
|
|
calculatedAt: statsAll.calculatedAt,
|
|
overall: {
|
|
users: statsAll.overall.users,
|
|
cards: 0,
|
|
pageViews: statsAll.overall.plausible?.pageviews || 0,
|
|
visitors: statsAll.overall.plausible?.visitors || 0,
|
|
online: statsAll.overall.plausible?.realTimeVisitors || 0,
|
|
},
|
|
current: {},
|
|
};
|
|
|
|
for (const [locale, localeStats] of Object.entries(statsAll.locales)) {
|
|
stats.overall.cards += localeStats.users;
|
|
if (locale === requestedLocale) {
|
|
stats.current = {
|
|
cards: localeStats.users,
|
|
};
|
|
}
|
|
if (localeStats.plausible) {
|
|
stats.overall.pageViews += localeStats.plausible.pageviews;
|
|
stats.overall.visitors += localeStats.plausible.visitors;
|
|
stats.overall.online += localeStats.plausible.realTimeVisitors;
|
|
if (locale === requestedLocale) {
|
|
stats.current.pageViews = localeStats.plausible.pageviews;
|
|
stats.current.visitors = localeStats.plausible.visitors;
|
|
stats.current.online = localeStats.plausible.realTimeVisitors;
|
|
stats.current.visitDuration = localeStats.plausible.visit_duration;
|
|
}
|
|
}
|
|
if (localeStats.heartbeat && locale === requestedLocale) {
|
|
stats.current.uptime = localeStats.heartbeat.uptime;
|
|
stats.current.responseTime = localeStats.heartbeat.avgResponseTime;
|
|
}
|
|
}
|
|
|
|
return stats;
|
|
});
|