fix Analyse
This commit is contained in:
@@ -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];
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user