Statistik backend and favicon

This commit is contained in:
2025-09-04 17:27:45 +02:00
parent eb1d713942
commit 1f82c98646
12 changed files with 361 additions and 0 deletions

View File

@@ -1622,6 +1622,108 @@ router.delete('/admin-adminusers/:id', requireAdminAuth, async (req, res) => {
}
});
// ============================================================================
// PAGE VIEWS TRACKING
// ============================================================================
// Track page view
router.post('/track-page-view', async (req, res) => {
try {
const { page, userAgent, ipAddress, referer } = req.body;
await pool.query(`
INSERT INTO page_views (page, user_agent, ip_address, referer)
VALUES ($1, $2, $3, $4)
`, [page, userAgent, ipAddress, referer]);
res.json({ success: true });
} catch (error) {
console.error('Error tracking page view:', error);
res.status(500).json({
success: false,
message: 'Fehler beim Tracking der Seitenaufrufe'
});
}
});
// Get page statistics
router.get('/admin-page-stats', requireAdminAuth, async (req, res) => {
try {
// Page views for today, this week, this month
const today = new Date();
const startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate());
const startOfWeek = new Date(today);
startOfWeek.setDate(today.getDate() - today.getDay());
startOfWeek.setHours(0, 0, 0, 0);
const startOfMonth = new Date(today.getFullYear(), today.getMonth(), 1);
// Today's page views
const todayViews = await pool.query(`
SELECT page, COUNT(*) as count
FROM page_views
WHERE created_at >= $1
GROUP BY page
ORDER BY count DESC
`, [startOfDay]);
// This week's page views
const weekViews = await pool.query(`
SELECT page, COUNT(*) as count
FROM page_views
WHERE created_at >= $1
GROUP BY page
ORDER BY count DESC
`, [startOfWeek]);
// This month's page views
const monthViews = await pool.query(`
SELECT page, COUNT(*) as count
FROM page_views
WHERE created_at >= $1
GROUP BY page
ORDER BY count DESC
`, [startOfMonth]);
// Total page views
const totalViews = await pool.query(`
SELECT page, COUNT(*) as count
FROM page_views
GROUP BY page
ORDER BY count DESC
`);
// Player/Supabase link statistics
const linkStats = await pool.query(`
SELECT
COUNT(*) as total_players,
COUNT(CASE WHEN supabase_user_id IS NOT NULL THEN 1 END) as linked_players,
CAST(
ROUND(
(COUNT(CASE WHEN supabase_user_id IS NOT NULL THEN 1 END)::numeric / COUNT(*)) * 100, 2
) AS DECIMAL(5,2)
) as link_percentage
FROM players
`);
res.json({
success: true,
data: {
today: todayViews.rows,
week: weekViews.rows,
month: monthViews.rows,
total: totalViews.rows,
linkStats: linkStats.rows[0]
}
});
} catch (error) {
console.error('Error loading page statistics:', error);
res.status(500).json({
success: false,
message: 'Fehler beim Laden der Seitenstatistiken'
});
}
});
// ============================================================================
// POST/PUT ROUTES FÜR CRUD-OPERATIONEN
// ============================================================================