refactor(logging): replace console.* with structured logger across server
Add server/logger.js - zero-dependency, level-based logger that outputs JSON in production and human-readable format in development. Controlled via LOG_LEVEL env var (debug/info/warn/error, default: info). Replaces all 100 console.log/warn/error calls in 14 server files.
This commit is contained in:
@@ -6,6 +6,9 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const { createLogger } = require('../logger');
|
||||
const log = createLogger('Budget');
|
||||
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
@@ -117,7 +120,7 @@ router.get('/summary', (req, res) => {
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
console.error('[budget/GET /summary]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -167,7 +170,7 @@ router.get('/export', (req, res) => {
|
||||
res.setHeader('Content-Disposition', `attachment; filename="budget-${month}.csv"`);
|
||||
res.send('\uFEFF' + header + rows); // BOM für Excel
|
||||
} catch (err) {
|
||||
console.error('[budget/GET /export]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -221,7 +224,7 @@ router.get('/', (req, res) => {
|
||||
const entries = db.get().prepare(sql).all(...params);
|
||||
res.json({ data: entries });
|
||||
} catch (err) {
|
||||
console.error('[budget/GET /]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -259,7 +262,7 @@ router.post('/', (req, res) => {
|
||||
|
||||
res.status(201).json({ data: entry });
|
||||
} catch (err) {
|
||||
console.error('[budget/POST /]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -312,7 +315,7 @@ router.put('/:id', (req, res) => {
|
||||
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
console.error('[budget/PUT /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -340,7 +343,7 @@ router.delete('/:id', (req, res) => {
|
||||
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
console.error('[budget/DELETE /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
+20
-17
@@ -7,6 +7,9 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const { createLogger } = require('../logger');
|
||||
const log = createLogger('Calendar');
|
||||
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
@@ -152,7 +155,7 @@ router.get('/', (req, res) => {
|
||||
const events = expandRecurringEvents(rawEvents, from, to);
|
||||
res.json({ data: events, from, to });
|
||||
} catch (err) {
|
||||
console.error('[calendar/GET /]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -190,7 +193,7 @@ router.get('/upcoming', (req, res) => {
|
||||
|
||||
res.json({ data: expanded });
|
||||
} catch (err) {
|
||||
console.error('[calendar/GET /upcoming]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -210,7 +213,7 @@ router.get('/google/auth', requireAdmin, (req, res) => {
|
||||
if (!url) return res.status(503).json({ error: 'Google nicht konfiguriert.', code: 503 });
|
||||
res.redirect(url);
|
||||
} catch (err) {
|
||||
console.error('[calendar/google/auth]', err);
|
||||
log.error('', err);
|
||||
res.status(503).json({ error: err.message, code: 503 });
|
||||
}
|
||||
});
|
||||
@@ -228,7 +231,7 @@ router.get('/google/callback', async (req, res) => {
|
||||
|
||||
// OAuth CSRF-Schutz: state-Parameter validieren
|
||||
if (!state || !req.session.googleOAuthState || state !== req.session.googleOAuthState) {
|
||||
console.error('[calendar/google/callback] OAuth state mismatch');
|
||||
log.error('OAuth state mismatch');
|
||||
return res.redirect('/settings?sync_error=google');
|
||||
}
|
||||
delete req.session.googleOAuthState;
|
||||
@@ -236,11 +239,11 @@ router.get('/google/callback', async (req, res) => {
|
||||
await googleCalendar.handleCallback(code);
|
||||
|
||||
// Initialen Sync im Hintergrund starten (kein await - Redirect soll sofort erfolgen)
|
||||
googleCalendar.sync().catch((e) => console.error('[Google] Initialer Sync fehlgeschlagen:', e.message));
|
||||
googleCalendar.sync().catch((e) => log.error('Initialer Sync fehlgeschlagen:', e.message));
|
||||
|
||||
res.redirect('/settings?sync_ok=google');
|
||||
} catch (err) {
|
||||
console.error('[calendar/google/callback]', err);
|
||||
log.error('', err);
|
||||
res.redirect('/settings?sync_error=google');
|
||||
}
|
||||
});
|
||||
@@ -256,7 +259,7 @@ router.post('/google/sync', requireAdmin, async (req, res) => {
|
||||
const { lastSync } = googleCalendar.getStatus();
|
||||
res.json({ ok: true, lastSync });
|
||||
} catch (err) {
|
||||
console.error('[calendar/google/sync]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: err.message, code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -269,7 +272,7 @@ router.get('/google/status', (req, res) => {
|
||||
try {
|
||||
res.json(googleCalendar.getStatus());
|
||||
} catch (err) {
|
||||
console.error('[calendar/google/status]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -284,7 +287,7 @@ router.delete('/google/disconnect', requireAdmin, (req, res) => {
|
||||
googleCalendar.disconnect();
|
||||
res.json({ ok: true });
|
||||
} catch (err) {
|
||||
console.error('[calendar/google/disconnect]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -301,7 +304,7 @@ router.get('/apple/status', (req, res) => {
|
||||
try {
|
||||
res.json(appleCalendar.getStatus());
|
||||
} catch (err) {
|
||||
console.error('[calendar/apple/status]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -317,7 +320,7 @@ router.post('/apple/sync', requireAdmin, async (req, res) => {
|
||||
const { lastSync } = appleCalendar.getStatus();
|
||||
res.json({ ok: true, lastSync });
|
||||
} catch (err) {
|
||||
console.error('[calendar/apple/sync]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: err.message, code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -348,7 +351,7 @@ router.post('/apple/connect', requireAdmin, async (req, res) => {
|
||||
} catch (err) {
|
||||
// Bei Fehler: gespeicherte Credentials wieder löschen
|
||||
appleCalendar.clearCredentials();
|
||||
console.error('[calendar/apple/connect]', err);
|
||||
log.error('', err);
|
||||
res.status(400).json({ error: err.message.replace('[Apple] ', ''), code: 400 });
|
||||
}
|
||||
});
|
||||
@@ -363,7 +366,7 @@ router.delete('/apple/disconnect', requireAdmin, (req, res) => {
|
||||
appleCalendar.clearCredentials();
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
console.error('[calendar/apple/disconnect]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -390,7 +393,7 @@ router.get('/:id', (req, res) => {
|
||||
if (!event) return res.status(404).json({ error: 'Termin nicht gefunden', code: 404 });
|
||||
res.json({ data: event });
|
||||
} catch (err) {
|
||||
console.error('[calendar/GET /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -448,7 +451,7 @@ router.post('/', (req, res) => {
|
||||
|
||||
res.status(201).json({ data: event });
|
||||
} catch (err) {
|
||||
console.error('[calendar/POST /]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -519,7 +522,7 @@ router.put('/:id', (req, res) => {
|
||||
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
console.error('[calendar/PUT /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -537,7 +540,7 @@ router.delete('/:id', (req, res) => {
|
||||
return res.status(404).json({ error: 'Termin nicht gefunden', code: 404 });
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
console.error('[calendar/DELETE /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const { createLogger } = require('../logger');
|
||||
const log = createLogger('Contacts');
|
||||
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
@@ -43,7 +46,7 @@ router.get('/', (req, res) => {
|
||||
const contacts = db.get().prepare(sql).all(...params);
|
||||
res.json({ data: contacts });
|
||||
} catch (err) {
|
||||
console.error('[contacts/GET /]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -74,7 +77,7 @@ router.post('/', (req, res) => {
|
||||
const contact = db.get().prepare('SELECT * FROM contacts WHERE id = ?').get(result.lastInsertRowid);
|
||||
res.status(201).json({ data: contact });
|
||||
} catch (err) {
|
||||
console.error('[contacts/POST /]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -123,7 +126,7 @@ router.put('/:id', (req, res) => {
|
||||
const updated = db.get().prepare('SELECT * FROM contacts WHERE id = ?').get(id);
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
console.error('[contacts/PUT /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -141,7 +144,7 @@ router.delete('/:id', (req, res) => {
|
||||
return res.status(404).json({ error: 'Kontakt nicht gefunden', code: 404 });
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
console.error('[contacts/DELETE /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -155,7 +158,7 @@ router.get('/meta', (_req, res) => {
|
||||
try {
|
||||
res.json({ data: { categories: VALID_CATEGORIES } });
|
||||
} catch (err) {
|
||||
console.error('[contacts/GET /meta]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -193,7 +196,7 @@ router.get('/:id/vcard', (req, res) => {
|
||||
res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
|
||||
res.send(vcf);
|
||||
} catch (err) {
|
||||
console.error('[contacts/GET /:id/vcard]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const { createLogger } = require('../logger');
|
||||
const log = createLogger('Dashboard');
|
||||
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
@@ -48,7 +51,7 @@ router.get('/', (req, res) => {
|
||||
LIMIT 5
|
||||
`).all(now.toISOString());
|
||||
} catch (err) {
|
||||
console.error('[Dashboard] upcomingEvents-Fehler:', err.message);
|
||||
log.error('upcomingEvents-Fehler:', err.message);
|
||||
result.upcomingEvents = [];
|
||||
}
|
||||
|
||||
@@ -74,7 +77,7 @@ router.get('/', (req, res) => {
|
||||
LIMIT 5
|
||||
`).all();
|
||||
} catch (err) {
|
||||
console.error('[Dashboard] urgentTasks-Fehler:', err.message);
|
||||
log.error('urgentTasks-Fehler:', err.message);
|
||||
result.urgentTasks = [];
|
||||
}
|
||||
|
||||
@@ -92,7 +95,7 @@ router.get('/', (req, res) => {
|
||||
END
|
||||
`).all(todayStr);
|
||||
} catch (err) {
|
||||
console.error('[Dashboard] todayMeals-Fehler:', err.message);
|
||||
log.error('todayMeals-Fehler:', err.message);
|
||||
result.todayMeals = [];
|
||||
}
|
||||
|
||||
@@ -106,7 +109,7 @@ router.get('/', (req, res) => {
|
||||
LIMIT 3
|
||||
`).all();
|
||||
} catch (err) {
|
||||
console.error('[Dashboard] pinnedNotes-Fehler:', err.message);
|
||||
log.error('pinnedNotes-Fehler:', err.message);
|
||||
result.pinnedNotes = [];
|
||||
}
|
||||
|
||||
@@ -121,7 +124,7 @@ router.get('/', (req, res) => {
|
||||
|
||||
res.json(result);
|
||||
} catch (err) {
|
||||
console.error('[Dashboard] Kritischer Fehler:', err.message);
|
||||
log.error('Kritischer Fehler:', err.message);
|
||||
res.status(500).json({ error: 'Dashboard konnte nicht geladen werden.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
+13
-10
@@ -6,6 +6,9 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const { createLogger } = require('../logger');
|
||||
const log = createLogger('Meals');
|
||||
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
@@ -64,7 +67,7 @@ router.get('/suggestions', (req, res) => {
|
||||
|
||||
res.json({ data: rows });
|
||||
} catch (err) {
|
||||
console.error('[meals/suggestions]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -131,7 +134,7 @@ router.get('/', (req, res) => {
|
||||
|
||||
res.json({ data: result, weekStart: from, weekEnd: to });
|
||||
} catch (err) {
|
||||
console.error('[meals/GET /]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -190,7 +193,7 @@ router.post('/', (req, res) => {
|
||||
|
||||
res.status(201).json({ data: { ...meal, ingredients: ings } });
|
||||
} catch (err) {
|
||||
console.error('[meals/POST /]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -242,7 +245,7 @@ router.put('/:id', (req, res) => {
|
||||
|
||||
res.json({ data: { ...updated, ingredients: ings } });
|
||||
} catch (err) {
|
||||
console.error('[meals/PUT /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -260,7 +263,7 @@ router.delete('/:id', (req, res) => {
|
||||
return res.status(404).json({ error: 'Mahlzeit nicht gefunden', code: 404 });
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
console.error('[meals/DELETE /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -295,7 +298,7 @@ router.post('/:id/ingredients', (req, res) => {
|
||||
|
||||
res.status(201).json({ data: ing });
|
||||
} catch (err) {
|
||||
console.error('[meals/POST /:id/ingredients]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -333,7 +336,7 @@ router.patch('/ingredients/:ingId', (req, res) => {
|
||||
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
console.error('[meals/PATCH /ingredients/:ingId]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -351,7 +354,7 @@ router.delete('/ingredients/:ingId', (req, res) => {
|
||||
return res.status(404).json({ error: 'Zutat nicht gefunden', code: 404 });
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
console.error('[meals/DELETE /ingredients/:ingId]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -407,7 +410,7 @@ router.post('/:id/to-shopping-list', (req, res) => {
|
||||
|
||||
res.json({ data: { transferred } });
|
||||
} catch (err) {
|
||||
console.error('[meals/POST /:id/to-shopping-list]', err);
|
||||
log.error('POST /:id/to-shopping-list', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -463,7 +466,7 @@ router.post('/week-to-shopping-list', (req, res) => {
|
||||
|
||||
res.json({ data: { transferred } });
|
||||
} catch (err) {
|
||||
console.error('[meals/POST /week-to-shopping-list]', err);
|
||||
log.error('POST /week-to-shopping-list', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const { createLogger } = require('../logger');
|
||||
const log = createLogger('Notes');
|
||||
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
@@ -26,7 +29,7 @@ router.get('/', (req, res) => {
|
||||
`).all();
|
||||
res.json({ data: notes });
|
||||
} catch (err) {
|
||||
console.error('[notes/GET /]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -59,7 +62,7 @@ router.post('/', (req, res) => {
|
||||
|
||||
res.status(201).json({ data: note });
|
||||
} catch (err) {
|
||||
console.error('[notes/POST /]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -106,7 +109,7 @@ router.put('/:id', (req, res) => {
|
||||
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
console.error('[notes/PUT /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -126,7 +129,7 @@ router.patch('/:id/pin', (req, res) => {
|
||||
db.get().prepare('UPDATE notes SET pinned = ? WHERE id = ?').run(newPinned, id);
|
||||
res.json({ data: { id, pinned: newPinned } });
|
||||
} catch (err) {
|
||||
console.error('[notes/PATCH /:id/pin]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -144,7 +147,7 @@ router.delete('/:id', (req, res) => {
|
||||
return res.status(404).json({ error: 'Notiz nicht gefunden', code: 404 });
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
console.error('[notes/DELETE /:id]', err);
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
+13
-10
@@ -9,6 +9,9 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const { createLogger } = require('../logger');
|
||||
const log = createLogger('Shopping');
|
||||
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
@@ -42,7 +45,7 @@ router.get('/suggestions', (req, res) => {
|
||||
|
||||
res.json({ data: rows.map((r) => r.name) });
|
||||
} catch (err) {
|
||||
console.error('[Shopping] suggestions Fehler:', err);
|
||||
log.error('suggestions Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -82,7 +85,7 @@ router.patch('/items/:itemId', (req, res) => {
|
||||
.get(req.params.itemId);
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
console.error('[Shopping] PATCH items/:id Fehler:', err);
|
||||
log.error('PATCH items/:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -101,7 +104,7 @@ router.delete('/items/:itemId', (req, res) => {
|
||||
return res.status(404).json({ error: 'Artikel nicht gefunden.', code: 404 });
|
||||
res.json({ ok: true });
|
||||
} catch (err) {
|
||||
console.error('[Shopping] DELETE items/:id Fehler:', err);
|
||||
log.error('DELETE items/:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -125,7 +128,7 @@ router.get('/', (req, res) => {
|
||||
`).all();
|
||||
res.json({ data: lists });
|
||||
} catch (err) {
|
||||
console.error('[Shopping] GET / Fehler:', err);
|
||||
log.error('GET / Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -150,7 +153,7 @@ router.post('/', (req, res) => {
|
||||
.get(result.lastInsertRowid);
|
||||
res.status(201).json({ data: list });
|
||||
} catch (err) {
|
||||
console.error('[Shopping] POST / Fehler:', err);
|
||||
log.error('POST / Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -177,7 +180,7 @@ router.put('/:listId', (req, res) => {
|
||||
.get(req.params.listId);
|
||||
res.json({ data: list });
|
||||
} catch (err) {
|
||||
console.error('[Shopping] PUT /:listId Fehler:', err);
|
||||
log.error('PUT /:listId Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -196,7 +199,7 @@ router.delete('/:listId', (req, res) => {
|
||||
return res.status(404).json({ error: 'Liste nicht gefunden.', code: 404 });
|
||||
res.json({ ok: true });
|
||||
} catch (err) {
|
||||
console.error('[Shopping] DELETE /:listId Fehler:', err);
|
||||
log.error('DELETE /:listId Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -227,7 +230,7 @@ router.get('/:listId/items', (req, res) => {
|
||||
|
||||
res.json({ data: items, list });
|
||||
} catch (err) {
|
||||
console.error('[Shopping] GET /:listId/items Fehler:', err);
|
||||
log.error('GET /:listId/items Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -261,7 +264,7 @@ router.post('/:listId/items', (req, res) => {
|
||||
.get(result.lastInsertRowid);
|
||||
res.status(201).json({ data: item });
|
||||
} catch (err) {
|
||||
console.error('[Shopping] POST /:listId/items Fehler:', err);
|
||||
log.error('POST /:listId/items Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -278,7 +281,7 @@ router.delete('/:listId/items/checked', (req, res) => {
|
||||
`).run(req.params.listId);
|
||||
res.json({ deleted: result.changes });
|
||||
} catch (err) {
|
||||
console.error('[Shopping] DELETE /:listId/items/checked Fehler:', err);
|
||||
log.error('DELETE /:listId/items/checked Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
+10
-7
@@ -6,6 +6,9 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const { createLogger } = require('../logger');
|
||||
const log = createLogger('Tasks');
|
||||
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
@@ -101,7 +104,7 @@ router.get('/', (req, res) => {
|
||||
|
||||
res.json({ data: db.get().prepare(sql).all(...params) });
|
||||
} catch (err) {
|
||||
console.error('[Tasks] GET / Fehler:', err);
|
||||
log.error('GET / Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -125,7 +128,7 @@ router.get('/:id', (req, res) => {
|
||||
task.subtasks = loadSubtasks(task.id);
|
||||
res.json({ data: task });
|
||||
} catch (err) {
|
||||
console.error('[Tasks] GET /:id Fehler:', err);
|
||||
log.error('GET /:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -183,7 +186,7 @@ router.post('/', (req, res) => {
|
||||
|
||||
res.status(201).json({ data: task });
|
||||
} catch (err) {
|
||||
console.error('[Tasks] POST / Fehler:', err);
|
||||
log.error('POST / Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -235,7 +238,7 @@ router.put('/:id', (req, res) => {
|
||||
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
console.error('[Tasks] PUT /:id Fehler:', err);
|
||||
log.error('PUT /:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -279,7 +282,7 @@ router.patch('/:id/status', (req, res) => {
|
||||
|
||||
res.json({ data: { id: Number(req.params.id), status } });
|
||||
} catch (err) {
|
||||
console.error('[Tasks] PATCH /:id/status Fehler:', err);
|
||||
log.error('PATCH /:id/status Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -296,7 +299,7 @@ router.delete('/:id', (req, res) => {
|
||||
return res.status(404).json({ error: 'Aufgabe nicht gefunden.', code: 404 });
|
||||
res.json({ ok: true });
|
||||
} catch (err) {
|
||||
console.error('[Tasks] DELETE /:id Fehler:', err);
|
||||
log.error('DELETE /:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
@@ -313,7 +316,7 @@ router.get('/meta/options', (req, res) => {
|
||||
).all();
|
||||
res.json({ users, priorities: VALID_PRIORITIES, statuses: VALID_STATUSES, categories: VALID_CATEGORIES });
|
||||
} catch (err) {
|
||||
console.error('[Tasks] GET /meta/options Fehler:', err);
|
||||
log.error('GET /meta/options Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const { createLogger } = require('../logger');
|
||||
const log = createLogger('Weather');
|
||||
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
|
||||
@@ -43,7 +46,7 @@ router.get('/', async (req, res) => {
|
||||
const currentUrl = `https://api.openweathermap.org/data/2.5/weather?q=${encodeURIComponent(city)}&appid=${apiKey}&units=${units}&lang=${lang}`;
|
||||
const currentRes = await fetch(currentUrl, { signal: AbortSignal.timeout(8000) });
|
||||
if (!currentRes.ok) {
|
||||
console.warn(`[Weather] API Fehler: ${currentRes.status}`);
|
||||
log.warn(`API Fehler: ${currentRes.status}`);
|
||||
return res.json({ data: null });
|
||||
}
|
||||
const currentJson = await currentRes.json();
|
||||
@@ -87,7 +90,7 @@ router.get('/', async (req, res) => {
|
||||
cache = { data, ts: Date.now() };
|
||||
res.json({ data });
|
||||
} catch (err) {
|
||||
console.warn('[Weather] Fehler:', err.message);
|
||||
log.warn('Fehler:', err.message);
|
||||
res.json({ data: null }); // Fallback: Widget ausblenden, kein Error-Screen
|
||||
}
|
||||
});
|
||||
@@ -116,7 +119,7 @@ router.get('/icon/:code', async (req, res) => {
|
||||
res.setHeader('Cache-Control', 'public, max-age=86400'); // 24 Stunden
|
||||
upstream.body.pipe(res);
|
||||
} catch (err) {
|
||||
console.warn('[Weather] Icon-Proxy Fehler:', err.message);
|
||||
log.warn('Icon-Proxy Fehler:', err.message);
|
||||
res.status(502).json({ error: 'Icon-Proxy fehlgeschlagen.', code: 502 });
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user