fix Analyse
This commit is contained in:
@@ -26,6 +26,7 @@ function saveDB(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let db = loadDB();
|
let db = loadDB();
|
||||||
|
let dirty = false;
|
||||||
|
|
||||||
function nextId() {
|
function nextId() {
|
||||||
db._counter = (db._counter || 0) + 1;
|
db._counter = (db._counter || 0) + 1;
|
||||||
@@ -45,10 +46,20 @@ export function trackEvent(type, userId, metadata = {}) {
|
|||||||
...metadata,
|
...metadata,
|
||||||
};
|
};
|
||||||
db.events.push(event);
|
db.events.push(event);
|
||||||
saveDB(db);
|
dirty = true;
|
||||||
return event;
|
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 } = {}) {
|
export function getEvents({ from, to, type, user_id, limit = 100 } = {}) {
|
||||||
let results = [...db.events];
|
let results = [...db.events];
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,20 @@ app.use('/api/auth', authRouter);
|
|||||||
app.use('/api/recipes', recipesRouter);
|
app.use('/api/recipes', recipesRouter);
|
||||||
app.use('/api/analytics', authMiddleware, adminMiddleware, analyticsRouter);
|
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 adminUser = process.env.ADMIN_USER || 'admin';
|
||||||
const adminPass = process.env.ADMIN_PASS || 'admin123';
|
const adminPass = process.env.ADMIN_PASS || 'admin123';
|
||||||
|
|
||||||
|
|||||||
@@ -82,7 +82,8 @@ async function analyticsFetch(url, token) {
|
|||||||
try { msg = JSON.parse(text).error || msg; } catch {}
|
try { msg = JSON.parse(text).error || msg; } catch {}
|
||||||
throw new Error(msg);
|
throw new Error(msg);
|
||||||
}
|
}
|
||||||
return JSON.parse(text);
|
if (!text) return [];
|
||||||
|
try { return JSON.parse(text); } catch { return []; }
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchAnalyticsOverview(token) {
|
export async function fetchAnalyticsOverview(token) {
|
||||||
|
|||||||
@@ -77,16 +77,16 @@ export default function Analytics() {
|
|||||||
const load = async () => {
|
const load = async () => {
|
||||||
try {
|
try {
|
||||||
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
|
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
|
||||||
const [ov, pv, us, act] = await Promise.all([
|
const ov = await fetchAnalyticsOverview(token);
|
||||||
fetchAnalyticsOverview(token),
|
setOverview(ov);
|
||||||
|
const [pv, us, act] = await Promise.allSettled([
|
||||||
fetchAnalyticsPageviews(token, thirtyDaysAgo),
|
fetchAnalyticsPageviews(token, thirtyDaysAgo),
|
||||||
fetchAnalyticsUsers(token),
|
fetchAnalyticsUsers(token),
|
||||||
fetchAnalyticsActivity(token),
|
fetchAnalyticsActivity(token),
|
||||||
]);
|
]);
|
||||||
setOverview(ov);
|
if (pv.status === 'fulfilled') setPageviews(pv.value);
|
||||||
setPageviews(pv);
|
if (us.status === 'fulfilled') setUsers(us.value);
|
||||||
setUsers(us);
|
if (act.status === 'fulfilled') setActivity(act.value);
|
||||||
setActivity(act);
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Analytics Fehler:', e);
|
console.error('Analytics Fehler:', e);
|
||||||
setError(e.message);
|
setError(e.message);
|
||||||
|
|||||||
Reference in New Issue
Block a user