Replacing entire backend messages (especially logs) with English instead of Germany
This commit is contained in:
+19
-19
@@ -191,7 +191,7 @@ router.get('/summary', (req, res) => {
|
||||
});
|
||||
} catch (err) {
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -219,7 +219,7 @@ router.get('/export', (req, res) => {
|
||||
ORDER BY b.date ASC
|
||||
`).all(from, to);
|
||||
|
||||
const header = 'Datum,Titel,Betrag,Kategorie,Unterkategorie,Wiederkehrend,Erstellt von\n';
|
||||
const header = 'Date,Title,Amount,Category,Subcategory,Recurring,Created by\n';
|
||||
const csvSafe = (val) => {
|
||||
let s = String(val || '').replace(/"/g, '""');
|
||||
if (/^[=+\-@\t\r]/.test(s)) s = "'" + s;
|
||||
@@ -232,7 +232,7 @@ router.get('/export', (req, res) => {
|
||||
e.amount.toFixed(2).replace('.', ','),
|
||||
e.category,
|
||||
e.subcategory || '',
|
||||
e.is_recurring ? 'Ja' : 'Nein',
|
||||
e.is_recurring ? 'Yes' : 'No',
|
||||
csvSafe(e.creator_name),
|
||||
].join(',')
|
||||
).join('\n');
|
||||
@@ -242,7 +242,7 @@ router.get('/export', (req, res) => {
|
||||
res.send('\uFEFF' + header + rows); // BOM für Excel
|
||||
} catch (err) {
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -265,7 +265,7 @@ router.post('/categories', (req, res) => {
|
||||
const conflict = db.get().prepare(`
|
||||
SELECT key FROM budget_categories WHERE type = ? AND name = ? COLLATE NOCASE
|
||||
`).get(vType.value, vName.value);
|
||||
if (conflict) return res.status(409).json({ error: 'Kategorie existiert bereits.', code: 409 });
|
||||
if (conflict) return res.status(409).json({ error: 'Category already exists.', code: 409 });
|
||||
|
||||
const maxOrder = db.get().prepare(`
|
||||
SELECT COALESCE(MAX(sort_order), -1) AS m FROM budget_categories WHERE type = ?
|
||||
@@ -279,8 +279,8 @@ router.post('/categories', (req, res) => {
|
||||
const cat = db.get().prepare('SELECT key, name, type, sort_order FROM budget_categories WHERE key = ?').get(key);
|
||||
res.status(201).json({ data: cat });
|
||||
} catch (err) {
|
||||
log.error('POST /categories Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
log.error('POST /categories error:', err);
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -289,7 +289,7 @@ router.post('/categories/:categoryKey/subcategories', (req, res) => {
|
||||
const cat = db.get().prepare(`
|
||||
SELECT * FROM budget_categories WHERE key = ? AND type = 'expense'
|
||||
`).get(req.params.categoryKey);
|
||||
if (!cat) return res.status(404).json({ error: 'Kategorie nicht gefunden.', code: 404 });
|
||||
if (!cat) return res.status(404).json({ error: 'Category not found.', code: 404 });
|
||||
|
||||
const vName = str(req.body.name, 'Name', { max: MAX_SHORT });
|
||||
if (vName.error) return res.status(400).json({ error: vName.error, code: 400 });
|
||||
@@ -297,7 +297,7 @@ router.post('/categories/:categoryKey/subcategories', (req, res) => {
|
||||
const conflict = db.get().prepare(`
|
||||
SELECT key FROM budget_subcategories WHERE category_key = ? AND name = ? COLLATE NOCASE
|
||||
`).get(cat.key, vName.value);
|
||||
if (conflict) return res.status(409).json({ error: 'Unterkategorie existiert bereits.', code: 409 });
|
||||
if (conflict) return res.status(409).json({ error: 'Subcategory already exists.', code: 409 });
|
||||
|
||||
const maxOrder = db.get().prepare(`
|
||||
SELECT COALESCE(MAX(sort_order), -1) AS m FROM budget_subcategories WHERE category_key = ?
|
||||
@@ -313,8 +313,8 @@ router.post('/categories/:categoryKey/subcategories', (req, res) => {
|
||||
`).get(key);
|
||||
res.status(201).json({ data: sub });
|
||||
} catch (err) {
|
||||
log.error('POST /categories/:categoryKey/subcategories Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
log.error('POST /categories/:categoryKey/subcategories error:', err);
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -359,7 +359,7 @@ router.get('/', (req, res) => {
|
||||
res.json({ data: entries });
|
||||
} catch (err) {
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -381,7 +381,7 @@ router.post('/', (req, res) => {
|
||||
if (errors.length) return res.status(400).json({ error: errors.join(' '), code: 400 });
|
||||
const subcategory = validateSubcategory(vCat.value, req.body.subcategory);
|
||||
if (subcategory === null) {
|
||||
return res.status(400).json({ error: 'Ungültige Unterkategorie.', code: 400 });
|
||||
return res.status(400).json({ error: 'Invalid subcategory.', code: 400 });
|
||||
}
|
||||
|
||||
const result = db.get().prepare(`
|
||||
@@ -402,7 +402,7 @@ router.post('/', (req, res) => {
|
||||
res.status(201).json({ data: entry });
|
||||
} catch (err) {
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -416,7 +416,7 @@ router.put('/:id', (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.id, 10);
|
||||
const entry = db.get().prepare('SELECT * FROM budget_entries WHERE id = ?').get(id);
|
||||
if (!entry) return res.status(404).json({ error: 'Eintrag nicht gefunden', code: 404 });
|
||||
if (!entry) return res.status(404).json({ error: 'Entry not found', code: 404 });
|
||||
|
||||
const checks = [];
|
||||
if (req.body.title !== undefined) checks.push(str(req.body.title, 'Titel', { max: MAX_TITLE, required: false }));
|
||||
@@ -432,7 +432,7 @@ router.put('/:id', (req, res) => {
|
||||
? validateSubcategory(nextCategory, requestedSubcategory ?? entry.subcategory)
|
||||
: undefined;
|
||||
if (subcategory === null) {
|
||||
return res.status(400).json({ error: 'Ungültige Unterkategorie.', code: 400 });
|
||||
return res.status(400).json({ error: 'Invalid subcategory.', code: 400 });
|
||||
}
|
||||
|
||||
db.get().prepare(`
|
||||
@@ -464,7 +464,7 @@ router.put('/:id', (req, res) => {
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -477,7 +477,7 @@ router.delete('/:id', (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.id, 10);
|
||||
const entry = db.get().prepare('SELECT * FROM budget_entries WHERE id = ?').get(id);
|
||||
if (!entry) return res.status(404).json({ error: 'Eintrag nicht gefunden', code: 404 });
|
||||
if (!entry) return res.status(404).json({ error: 'Entry not found', code: 404 });
|
||||
|
||||
db.get().prepare('DELETE FROM budget_entries WHERE id = ?').run(id);
|
||||
|
||||
@@ -492,7 +492,7 @@ router.delete('/:id', (req, res) => {
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
log.error('', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -257,7 +257,7 @@ 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) => log.error('Initialer Sync fehlgeschlagen:', e.message));
|
||||
googleCalendar.sync().catch((e) => log.error('Initial sync failed:', e.message));
|
||||
|
||||
res.redirect('/settings?sync_ok=google');
|
||||
} catch (err) {
|
||||
|
||||
@@ -53,7 +53,7 @@ router.get('/', (req, res) => {
|
||||
LIMIT 5
|
||||
`).all(now.toISOString());
|
||||
} catch (err) {
|
||||
log.error('upcomingEvents-Fehler:', err.message);
|
||||
log.error('upcomingEvents error:', err.message);
|
||||
result.upcomingEvents = [];
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ router.get('/', (req, res) => {
|
||||
|
||||
result.urgentTasks = allOpen.slice(0, 5);
|
||||
} catch (err) {
|
||||
log.error('urgentTasks-Fehler:', err.message);
|
||||
log.error('urgentTasks error:', err.message);
|
||||
result.urgentTasks = [];
|
||||
}
|
||||
|
||||
@@ -116,7 +116,7 @@ router.get('/', (req, res) => {
|
||||
END
|
||||
`).all(todayStr, ...visibleTypes);
|
||||
} catch (err) {
|
||||
log.error('todayMeals-Fehler:', err.message);
|
||||
log.error('todayMeals error:', err.message);
|
||||
result.todayMeals = [];
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ router.get('/', (req, res) => {
|
||||
LIMIT 3
|
||||
`).all();
|
||||
} catch (err) {
|
||||
log.error('pinnedNotes-Fehler:', err.message);
|
||||
log.error('pinnedNotes error:', err.message);
|
||||
result.pinnedNotes = [];
|
||||
}
|
||||
|
||||
@@ -157,7 +157,7 @@ router.get('/', (req, res) => {
|
||||
}
|
||||
result.shoppingLists = lists;
|
||||
} catch (err) {
|
||||
log.error('shoppingLists-Fehler:', err.message);
|
||||
log.error('shoppingLists error:', err.message);
|
||||
result.shoppingLists = [];
|
||||
}
|
||||
|
||||
@@ -172,8 +172,8 @@ router.get('/', (req, res) => {
|
||||
|
||||
res.json(result);
|
||||
} catch (err) {
|
||||
log.error('Kritischer Fehler:', err.message);
|
||||
res.status(500).json({ error: 'Dashboard konnte nicht geladen werden.', code: 500 });
|
||||
log.error('Critical error:', err.message);
|
||||
res.status(500).json({ error: 'Dashboard could not be loaded.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
+14
-14
@@ -59,8 +59,8 @@ router.get('/', (_req, res) => {
|
||||
|
||||
res.json({ data: recipes.map((r) => ({ ...r, ingredients: ingredientMap[r.id] || [] })) });
|
||||
} catch (err) {
|
||||
log.error('GET / Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
log.error('GET / error:', err);
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -100,8 +100,8 @@ router.post('/', (req, res) => {
|
||||
const created = loadRecipeWithIngredients(recipeId);
|
||||
res.status(201).json({ data: created });
|
||||
} catch (err) {
|
||||
log.error('POST / Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
log.error('POST / error:', err);
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -111,8 +111,8 @@ router.put('/:id', (req, res) => {
|
||||
if (!id) return res.status(400).json({ error: 'Ungueltige Rezept-ID', code: 400 });
|
||||
|
||||
const existing = db.get().prepare('SELECT id, created_by FROM recipes WHERE id = ?').get(id);
|
||||
if (!existing) return res.status(404).json({ error: 'Rezept nicht gefunden', code: 404 });
|
||||
if (existing.created_by !== req.session.userId) return res.status(403).json({ error: 'Nicht autorisiert.', code: 403 });
|
||||
if (!existing) return res.status(404).json({ error: 'Recipe not found', code: 404 });
|
||||
if (existing.created_by !== req.session.userId) return res.status(403).json({ error: 'Not authorized.', code: 403 });
|
||||
|
||||
const { ingredients = [] } = req.body;
|
||||
|
||||
@@ -147,27 +147,27 @@ router.put('/:id', (req, res) => {
|
||||
const updated = loadRecipeWithIngredients(id);
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
log.error('PUT /:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
log.error('PUT /:id error:', err);
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
router.delete('/:id', (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.id, 10);
|
||||
if (!id) return res.status(400).json({ error: 'Ungültige Rezept-ID.', code: 400 });
|
||||
if (!id) return res.status(400).json({ error: 'Invalid recipe ID.', code: 400 });
|
||||
|
||||
const existing = db.get().prepare('SELECT id, created_by FROM recipes WHERE id = ?').get(id);
|
||||
if (!existing) return res.status(404).json({ error: 'Rezept nicht gefunden.', code: 404 });
|
||||
if (existing.created_by !== req.session.userId) return res.status(403).json({ error: 'Nicht autorisiert.', code: 403 });
|
||||
if (!existing) return res.status(404).json({ error: 'Recipe not found.', code: 404 });
|
||||
if (existing.created_by !== req.session.userId) return res.status(403).json({ error: 'Not authorized.', code: 403 });
|
||||
|
||||
const result = db.get().prepare('DELETE FROM recipes WHERE id = ?').run(id);
|
||||
if (result.changes === 0) return res.status(404).json({ error: 'Rezept nicht gefunden', code: 404 });
|
||||
if (result.changes === 0) return res.status(404).json({ error: 'Recipe not found', code: 404 });
|
||||
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
log.error('DELETE /:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Fehler', code: 500 });
|
||||
log.error('DELETE /:id error:', err);
|
||||
res.status(500).json({ error: 'Internal error', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
+12
-12
@@ -41,8 +41,8 @@ router.get('/pending', (req, res) => {
|
||||
|
||||
res.json({ data: rows });
|
||||
} catch (err) {
|
||||
log.error('Fehler beim Laden fälliger Erinnerungen:', err.message);
|
||||
res.status(500).json({ error: 'Interner Fehler.', code: 500 });
|
||||
log.error('Error loading due reminders:', err.message);
|
||||
res.status(500).json({ error: 'Internal error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -69,8 +69,8 @@ router.get('/', (req, res) => {
|
||||
|
||||
res.json({ data: row || null });
|
||||
} catch (err) {
|
||||
log.error('Fehler beim Laden der Erinnerung:', err.message);
|
||||
res.status(500).json({ error: 'Interner Fehler.', code: 500 });
|
||||
log.error('Error loading reminder:', err.message);
|
||||
res.status(500).json({ error: 'Internal error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -115,8 +115,8 @@ router.post('/', (req, res) => {
|
||||
const row = db.get().prepare('SELECT * FROM reminders WHERE id = ?').get(result.lastInsertRowid);
|
||||
res.status(201).json({ data: row });
|
||||
} catch (err) {
|
||||
log.error('Fehler beim Erstellen der Erinnerung:', err.message);
|
||||
res.status(500).json({ error: 'Interner Fehler.', code: 500 });
|
||||
log.error('Error creating reminder:', err.message);
|
||||
res.status(500).json({ error: 'Internal error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -145,8 +145,8 @@ router.patch('/:id/dismiss', (req, res) => {
|
||||
db.get().prepare('UPDATE reminders SET dismissed = 1 WHERE id = ?').run(reminderId);
|
||||
res.json({ data: { id: reminderId } });
|
||||
} catch (err) {
|
||||
log.error('Fehler beim Verwerfen der Erinnerung:', err.message);
|
||||
res.status(500).json({ error: 'Interner Fehler.', code: 500 });
|
||||
log.error('Error dismissing reminder:', err.message);
|
||||
res.status(500).json({ error: 'Internal error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -175,8 +175,8 @@ router.delete('/:id', (req, res) => {
|
||||
db.get().prepare('DELETE FROM reminders WHERE id = ?').run(reminderId);
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
log.error('Fehler beim Löschen der Erinnerung:', err.message);
|
||||
res.status(500).json({ error: 'Interner Fehler.', code: 500 });
|
||||
log.error('Error deleting reminder:', err.message);
|
||||
res.status(500).json({ error: 'Internal error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -202,8 +202,8 @@ router.delete('/', (req, res) => {
|
||||
|
||||
res.status(204).end();
|
||||
} catch (err) {
|
||||
log.error('Fehler beim Löschen der Erinnerungen:', err.message);
|
||||
res.status(500).json({ error: 'Interner Fehler.', code: 500 });
|
||||
log.error('Error deleting reminders:', err.message);
|
||||
res.status(500).json({ error: 'Internal error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
+42
-42
@@ -39,8 +39,8 @@ router.get('/categories', (_req, res) => {
|
||||
try {
|
||||
res.json({ data: loadCategories() });
|
||||
} catch (err) {
|
||||
log.error('GET /categories Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('GET /categories error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -58,7 +58,7 @@ router.post('/categories', (req, res) => {
|
||||
const existing = db.get()
|
||||
.prepare('SELECT id FROM shopping_categories WHERE name = ? COLLATE NOCASE')
|
||||
.get(vName.value);
|
||||
if (existing) return res.status(409).json({ error: 'Kategorie existiert bereits.', code: 409 });
|
||||
if (existing) return res.status(409).json({ error: 'Category already exists.', code: 409 });
|
||||
|
||||
const maxOrder = db.get()
|
||||
.prepare('SELECT COALESCE(MAX(sort_order), -1) AS m FROM shopping_categories')
|
||||
@@ -73,8 +73,8 @@ router.post('/categories', (req, res) => {
|
||||
.get(result.lastInsertRowid);
|
||||
res.status(201).json({ data: cat });
|
||||
} catch (err) {
|
||||
log.error('POST /categories Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('POST /categories error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -89,7 +89,7 @@ router.put('/categories/:catId', (req, res) => {
|
||||
const cat = db.get()
|
||||
.prepare('SELECT * FROM shopping_categories WHERE id = ?')
|
||||
.get(req.params.catId);
|
||||
if (!cat) return res.status(404).json({ error: 'Kategorie nicht gefunden.', code: 404 });
|
||||
if (!cat) return res.status(404).json({ error: 'Category not found.', code: 404 });
|
||||
|
||||
const vName = str(req.body.name, 'Name', { max: MAX_SHORT });
|
||||
if (vName.error) return res.status(400).json({ error: vName.error, code: 400 });
|
||||
@@ -97,7 +97,7 @@ router.put('/categories/:catId', (req, res) => {
|
||||
const conflict = db.get()
|
||||
.prepare('SELECT id FROM shopping_categories WHERE name = ? COLLATE NOCASE AND id != ?')
|
||||
.get(vName.value, cat.id);
|
||||
if (conflict) return res.status(409).json({ error: 'Kategorie existiert bereits.', code: 409 });
|
||||
if (conflict) return res.status(409).json({ error: 'Category already exists.', code: 409 });
|
||||
|
||||
// Artikel, die die alte Kategorie nutzen, mitumbenennen
|
||||
db.get().transaction(() => {
|
||||
@@ -114,8 +114,8 @@ router.put('/categories/:catId', (req, res) => {
|
||||
.get(cat.id);
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
log.error('PUT /categories/:catId Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('PUT /categories/:catId error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -130,12 +130,12 @@ router.delete('/categories/:catId', (req, res) => {
|
||||
const cat = db.get()
|
||||
.prepare('SELECT * FROM shopping_categories WHERE id = ?')
|
||||
.get(req.params.catId);
|
||||
if (!cat) return res.status(404).json({ error: 'Kategorie nicht gefunden.', code: 404 });
|
||||
if (!cat) return res.status(404).json({ error: 'Category not found.', code: 404 });
|
||||
|
||||
const total = db.get()
|
||||
.prepare('SELECT COUNT(*) AS c FROM shopping_categories')
|
||||
.get().c;
|
||||
if (total <= 1) return res.status(400).json({ error: 'Letzte Kategorie kann nicht gelöscht werden.', code: 400 });
|
||||
if (total <= 1) return res.status(400).json({ error: 'The last category cannot be deleted.', code: 400 });
|
||||
|
||||
// Fallback-Kategorie: erste andere Kategorie nach sort_order
|
||||
const fallback = db.get()
|
||||
@@ -153,8 +153,8 @@ router.delete('/categories/:catId', (req, res) => {
|
||||
|
||||
res.json({ ok: true });
|
||||
} catch (err) {
|
||||
log.error('DELETE /categories/:catId Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('DELETE /categories/:catId error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -177,8 +177,8 @@ router.patch('/categories/reorder', (req, res) => {
|
||||
|
||||
res.json({ data: loadCategories() });
|
||||
} catch (err) {
|
||||
log.error('PATCH /categories/reorder Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('PATCH /categories/reorder error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -201,8 +201,8 @@ router.get('/suggestions', (req, res) => {
|
||||
|
||||
res.json({ data: rows.map((r) => r.name) });
|
||||
} catch (err) {
|
||||
log.error('suggestions Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('suggestions error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -217,7 +217,7 @@ router.patch('/items/:itemId', (req, res) => {
|
||||
const item = db.get()
|
||||
.prepare('SELECT * FROM shopping_items WHERE id = ?')
|
||||
.get(req.params.itemId);
|
||||
if (!item) return res.status(404).json({ error: 'Artikel nicht gefunden.', code: 404 });
|
||||
if (!item) return res.status(404).json({ error: 'Item not found.', code: 404 });
|
||||
|
||||
const {
|
||||
is_checked = item.is_checked,
|
||||
@@ -230,7 +230,7 @@ router.patch('/items/:itemId', (req, res) => {
|
||||
|
||||
const validNames = validCategoryNames();
|
||||
if (category && !validNames.includes(category))
|
||||
return res.status(400).json({ error: 'Ungültige Kategorie.', code: 400 });
|
||||
return res.status(400).json({ error: 'Invalid category.', code: 400 });
|
||||
|
||||
db.get().prepare(`
|
||||
UPDATE shopping_items
|
||||
@@ -243,8 +243,8 @@ router.patch('/items/:itemId', (req, res) => {
|
||||
.get(req.params.itemId);
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
log.error('PATCH items/:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('PATCH items/:id error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -259,11 +259,11 @@ router.delete('/items/:itemId', (req, res) => {
|
||||
.prepare('DELETE FROM shopping_items WHERE id = ?')
|
||||
.run(req.params.itemId);
|
||||
if (result.changes === 0)
|
||||
return res.status(404).json({ error: 'Artikel nicht gefunden.', code: 404 });
|
||||
return res.status(404).json({ error: 'Item not found.', code: 404 });
|
||||
res.json({ ok: true });
|
||||
} catch (err) {
|
||||
log.error('DELETE items/:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('DELETE items/:id error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -286,8 +286,8 @@ router.get('/', (req, res) => {
|
||||
`).all();
|
||||
res.json({ data: lists });
|
||||
} catch (err) {
|
||||
log.error('GET / Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('GET / error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -311,8 +311,8 @@ router.post('/', (req, res) => {
|
||||
.get(result.lastInsertRowid);
|
||||
res.status(201).json({ data: list });
|
||||
} catch (err) {
|
||||
log.error('POST / Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('POST / error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -331,15 +331,15 @@ router.put('/:listId', (req, res) => {
|
||||
.prepare('UPDATE shopping_lists SET name = ? WHERE id = ?')
|
||||
.run(vName.value, req.params.listId);
|
||||
if (result.changes === 0)
|
||||
return res.status(404).json({ error: 'Liste nicht gefunden.', code: 404 });
|
||||
return res.status(404).json({ error: 'List not found.', code: 404 });
|
||||
|
||||
const list = db.get()
|
||||
.prepare('SELECT * FROM shopping_lists WHERE id = ?')
|
||||
.get(req.params.listId);
|
||||
res.json({ data: list });
|
||||
} catch (err) {
|
||||
log.error('PUT /:listId Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('PUT /:listId error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -354,11 +354,11 @@ router.delete('/:listId', (req, res) => {
|
||||
.prepare('DELETE FROM shopping_lists WHERE id = ?')
|
||||
.run(req.params.listId);
|
||||
if (result.changes === 0)
|
||||
return res.status(404).json({ error: 'Liste nicht gefunden.', code: 404 });
|
||||
return res.status(404).json({ error: 'List not found.', code: 404 });
|
||||
res.json({ ok: true });
|
||||
} catch (err) {
|
||||
log.error('DELETE /:listId Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('DELETE /:listId error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -373,7 +373,7 @@ router.get('/:listId/items', (req, res) => {
|
||||
const list = db.get()
|
||||
.prepare('SELECT * FROM shopping_lists WHERE id = ?')
|
||||
.get(req.params.listId);
|
||||
if (!list) return res.status(404).json({ error: 'Liste nicht gefunden.', code: 404 });
|
||||
if (!list) return res.status(404).json({ error: 'List not found.', code: 404 });
|
||||
|
||||
const categories = loadCategories();
|
||||
const categoryOrder = categories.map((c, i) => `WHEN '${c.name.replace(/'/g, "''")}' THEN ${i}`).join(' ');
|
||||
@@ -389,8 +389,8 @@ router.get('/:listId/items', (req, res) => {
|
||||
|
||||
res.json({ data: items, list, categories });
|
||||
} catch (err) {
|
||||
log.error('GET /:listId/items Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('GET /:listId/items error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -405,7 +405,7 @@ router.post('/:listId/items', (req, res) => {
|
||||
const list = db.get()
|
||||
.prepare('SELECT id FROM shopping_lists WHERE id = ?')
|
||||
.get(req.params.listId);
|
||||
if (!list) return res.status(404).json({ error: 'Liste nicht gefunden.', code: 404 });
|
||||
if (!list) return res.status(404).json({ error: 'List not found.', code: 404 });
|
||||
|
||||
const validNames = validCategoryNames();
|
||||
const defaultCat = validNames[0] ?? 'Sonstiges';
|
||||
@@ -427,8 +427,8 @@ router.post('/:listId/items', (req, res) => {
|
||||
.get(result.lastInsertRowid);
|
||||
res.status(201).json({ data: item });
|
||||
} catch (err) {
|
||||
log.error('POST /:listId/items Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('POST /:listId/items error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -444,8 +444,8 @@ router.delete('/:listId/items/checked', (req, res) => {
|
||||
`).run(req.params.listId);
|
||||
res.json({ deleted: result.changes });
|
||||
} catch (err) {
|
||||
log.error('DELETE /:listId/items/checked Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('DELETE /:listId/items/checked error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
+20
-20
@@ -103,8 +103,8 @@ router.get('/', (req, res) => {
|
||||
|
||||
res.json({ data: db.get().prepare(sql).all(...params) });
|
||||
} catch (err) {
|
||||
log.error('GET / Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('GET / error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -122,13 +122,13 @@ router.get('/:id', (req, res) => {
|
||||
WHERE t.id = ? AND t.parent_task_id IS NULL
|
||||
`).get(req.params.id);
|
||||
|
||||
if (!task) return res.status(404).json({ error: 'Aufgabe nicht gefunden.', code: 404 });
|
||||
if (!task) return res.status(404).json({ error: 'Task not found.', code: 404 });
|
||||
|
||||
task.subtasks = loadSubtasks(task.id);
|
||||
res.json({ data: task });
|
||||
} catch (err) {
|
||||
log.error('GET /:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('GET /:id error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -161,7 +161,7 @@ router.post('/', (req, res) => {
|
||||
if (parent_task_id) {
|
||||
const parent = db.get().prepare('SELECT parent_task_id FROM tasks WHERE id = ?')
|
||||
.get(parent_task_id);
|
||||
if (!parent) return res.status(404).json({ error: 'Übergeordnete Aufgabe nicht gefunden.', code: 404 });
|
||||
if (!parent) return res.status(404).json({ error: 'Parent task not found.', code: 404 });
|
||||
if (parent.parent_task_id)
|
||||
return res.status(400).json({ error: 'Maximal 2 Verschachtelungsebenen erlaubt.', code: 400 });
|
||||
}
|
||||
@@ -185,8 +185,8 @@ router.post('/', (req, res) => {
|
||||
|
||||
res.status(201).json({ data: task });
|
||||
} catch (err) {
|
||||
log.error('POST / Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('POST / error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -200,7 +200,7 @@ router.post('/', (req, res) => {
|
||||
router.put('/:id', (req, res) => {
|
||||
try {
|
||||
const task = db.get().prepare('SELECT * FROM tasks WHERE id = ?').get(req.params.id);
|
||||
if (!task) return res.status(404).json({ error: 'Aufgabe nicht gefunden.', code: 404 });
|
||||
if (!task) return res.status(404).json({ error: 'Task not found.', code: 404 });
|
||||
|
||||
const errors = validateTaskInput(req.body, false);
|
||||
if (errors.length) return res.status(400).json({ error: errors.join(' '), code: 400 });
|
||||
@@ -237,8 +237,8 @@ router.put('/:id', (req, res) => {
|
||||
|
||||
res.json({ data: updated });
|
||||
} catch (err) {
|
||||
log.error('PUT /:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('PUT /:id error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -252,13 +252,13 @@ router.patch('/:id/status', (req, res) => {
|
||||
try {
|
||||
const { status } = req.body;
|
||||
if (!VALID_STATUSES.includes(status))
|
||||
return res.status(400).json({ error: `Ungültiger Status. Erlaubt: ${VALID_STATUSES.join(', ')}`, code: 400 });
|
||||
return res.status(400).json({ error: `Invalid status. Allowed: ${VALID_STATUSES.join(', ')}`, code: 400 });
|
||||
|
||||
const result = db.get().prepare('UPDATE tasks SET status = ? WHERE id = ?')
|
||||
.run(status, req.params.id);
|
||||
|
||||
if (result.changes === 0)
|
||||
return res.status(404).json({ error: 'Aufgabe nicht gefunden.', code: 404 });
|
||||
return res.status(404).json({ error: 'Task not found.', code: 404 });
|
||||
|
||||
// Wiederkehrende Aufgabe: nächste Instanz erstellen wenn erledigt
|
||||
if (status === 'done') {
|
||||
@@ -281,8 +281,8 @@ router.patch('/:id/status', (req, res) => {
|
||||
|
||||
res.json({ data: { id: Number(req.params.id), status } });
|
||||
} catch (err) {
|
||||
log.error('PATCH /:id/status Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('PATCH /:id/status error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -295,11 +295,11 @@ router.delete('/:id', (req, res) => {
|
||||
try {
|
||||
const result = db.get().prepare('DELETE FROM tasks WHERE id = ?').run(req.params.id);
|
||||
if (result.changes === 0)
|
||||
return res.status(404).json({ error: 'Aufgabe nicht gefunden.', code: 404 });
|
||||
return res.status(404).json({ error: 'Task not found.', code: 404 });
|
||||
res.json({ ok: true });
|
||||
} catch (err) {
|
||||
log.error('DELETE /:id Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('DELETE /:id error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -315,8 +315,8 @@ router.get('/meta/options', (req, res) => {
|
||||
).all();
|
||||
res.json({ users, priorities: VALID_PRIORITIES, statuses: VALID_STATUSES, categories: VALID_CATEGORIES });
|
||||
} catch (err) {
|
||||
log.error('GET /meta/options Fehler:', err);
|
||||
res.status(500).json({ error: 'Interner Serverfehler.', code: 500 });
|
||||
log.error('GET /meta/options error:', err);
|
||||
res.status(500).json({ error: 'Internal server error.', code: 500 });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -45,7 +45,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) {
|
||||
log.warn(`API Fehler: ${currentRes.status}`);
|
||||
log.warn(`API error: ${currentRes.status}`);
|
||||
return res.json({ data: null });
|
||||
}
|
||||
const currentJson = await currentRes.json();
|
||||
@@ -116,7 +116,7 @@ router.get('/', async (req, res) => {
|
||||
cache = { data, ts: Date.now() };
|
||||
res.json({ data });
|
||||
} catch (err) {
|
||||
log.warn('Fehler:', err.message);
|
||||
log.warn('Error:', err.message);
|
||||
res.json({ data: null }); // Fallback: Widget ausblenden, kein Error-Screen
|
||||
}
|
||||
});
|
||||
@@ -145,8 +145,8 @@ router.get('/icon/:code', async (req, res) => {
|
||||
res.setHeader('Cache-Control', 'public, max-age=86400'); // 24 Stunden
|
||||
upstream.body.pipe(res);
|
||||
} catch (err) {
|
||||
log.warn('Icon-Proxy Fehler:', err.message);
|
||||
res.status(502).json({ error: 'Icon-Proxy fehlgeschlagen.', code: 502 });
|
||||
log.warn('Icon proxy error:', err.message);
|
||||
res.status(502).json({ error: 'Icon proxy failed.', code: 502 });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user