fix Analyse

This commit is contained in:
nadja
2026-08-26 17:26:23 +02:00
parent 51098328fa
commit 8abb00c206
4 changed files with 34 additions and 8 deletions

View File

@@ -26,6 +26,7 @@ function saveDB(data) {
}
let db = loadDB();
let dirty = false;
function nextId() {
db._counter = (db._counter || 0) + 1;
@@ -45,10 +46,20 @@ export function trackEvent(type, userId, metadata = {}) {
...metadata,
};
db.events.push(event);
saveDB(db);
dirty = true;
return event;
}
function flushToDisk() {
if (!dirty) return;
dirty = false;
saveDB(db);
}
setInterval(flushToDisk, 5000);
process.on('SIGTERM', () => { flushToDisk(); process.exit(0); });
process.on('SIGINT', () => { flushToDisk(); process.exit(0); });
export function getEvents({ from, to, type, user_id, limit = 100 } = {}) {
let results = [...db.events];

View File

@@ -40,6 +40,20 @@ app.use('/api/auth', authRouter);
app.use('/api/recipes', recipesRouter);
app.use('/api/analytics', authMiddleware, adminMiddleware, analyticsRouter);
app.use((err, req, res, next) => {
console.error('Server Fehler:', err.message);
if (!res.headersSent) {
res.status(500).json({ error: 'Interner Serverfehler' });
}
});
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err.message);
});
process.on('unhandledRejection', (err) => {
console.error('Unhandled Rejection:', err?.message || err);
});
const adminUser = process.env.ADMIN_USER || 'admin';
const adminPass = process.env.ADMIN_PASS || 'admin123';

View File

@@ -82,7 +82,8 @@ async function analyticsFetch(url, token) {
try { msg = JSON.parse(text).error || msg; } catch {}
throw new Error(msg);
}
return JSON.parse(text);
if (!text) return [];
try { return JSON.parse(text); } catch { return []; }
}
export async function fetchAnalyticsOverview(token) {

View File

@@ -77,16 +77,16 @@ export default function Analytics() {
const load = async () => {
try {
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
const [ov, pv, us, act] = await Promise.all([
fetchAnalyticsOverview(token),
const ov = await fetchAnalyticsOverview(token);
setOverview(ov);
const [pv, us, act] = await Promise.allSettled([
fetchAnalyticsPageviews(token, thirtyDaysAgo),
fetchAnalyticsUsers(token),
fetchAnalyticsActivity(token),
]);
setOverview(ov);
setPageviews(pv);
setUsers(us);
setActivity(act);
if (pv.status === 'fulfilled') setPageviews(pv.value);
if (us.status === 'fulfilled') setUsers(us.value);
if (act.status === 'fulfilled') setActivity(act.value);
} catch (e) {
console.error('Analytics Fehler:', e);
setError(e.message);