Statistik backend and favicon
This commit is contained in:
102
routes/api.js
102
routes/api.js
@@ -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
|
||||
// ============================================================================
|
||||
|
||||
Reference in New Issue
Block a user