Persoenliche Angaben: fehlende settings-Zeile ist ein gueltiger Zustand

Neu angelegte Benutzer hatten keine settings-Zeile - die legte bisher nur
die Migration von Hand fuer den Admin an, POST /admin/users dagegen nicht.
Der Code ging aber davon aus, dass die Zeile immer existiert:

- /vorlagen lieferte fuer neue Benutzer 500: die View greift auf
  settings.name zu, bekam aber undefined.
- PUT /api/v1/settings verwarf Schreibzugriffe stillschweigend: das blanke
  UPDATE traf null Zeilen und meldete trotzdem success.

Statt Platzhalter-Zeilen zu provisionieren ist "keine Zeile" jetzt ueberall
ein gueltiger Zustand - genau wie bei prompts, design und app_state:

- loadSettings() (neben loadPrompts()/loadDesign()) liefert {} statt
  undefined; alle sechs Lesestellen gehen darueber.
- PUT /api/v1/settings ist ein Upsert, GET liefert {} statt leerem Body.
- Chat-Tool bewerbung_detail: JOIN auf jobangebote zusaetzlich ueber
  j.user_id = b.user_id, wie derselbe JOIN an anderer Stelle.

Repariert auch bereits angelegte Benutzer ohne Backfill-Migration.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 22:16:45 +02:00
co-authored by Claude Opus 4.8
parent 0371aa85a5
commit b2e884d9b3
2 changed files with 35 additions and 12 deletions
+10 -3
View File
@@ -478,8 +478,10 @@ function createExternalApi(deps) {
// --- Settings ------------------------------------------------------
router.get('/settings', async (req, res) => {
try {
// A user who never saved their personal details has no settings row; that
// is a valid state, so answer with an empty object instead of no body.
const settings = await dbGet('SELECT * FROM settings WHERE user_id = ?', [uid()]);
res.json(settings);
res.json(settings || {});
} catch (error) {
console.error('API get settings error:', error);
res.status(500).json({ error: 'Serverfehler' });
@@ -489,9 +491,14 @@ function createExternalApi(deps) {
router.put('/settings', async (req, res) => {
try {
const { name, adresse, kundennummer } = req.body || {};
// Upsert, not UPDATE: a user without a settings row would otherwise match
// zero rows and the write would be silently dropped.
await dbRun(
'UPDATE settings SET name = ?, adresse = ?, kundennummer = ? WHERE user_id = ?',
[sanitizeInput(name), sanitizeInput(adresse), sanitizeInput(kundennummer), uid()]
`INSERT INTO settings (user_id, name, adresse, kundennummer)
VALUES (?, ?, ?, ?)
ON CONFLICT(user_id) DO UPDATE SET
name = excluded.name, adresse = excluded.adresse, kundennummer = excluded.kundennummer`,
[uid(), sanitizeInput(name), sanitizeInput(adresse), sanitizeInput(kundennummer)]
);
res.json({ success: true });
} catch (error) {