Bewerbungen favorisieren (statt Jobangebote)

Stern zum Merken einzelner Bewerbungen auf der Startseiten-Liste, der
Bewerbungsdetailseite und einer neuen 'Gemerkte Bewerbungen'-Sektion ganz
oben — unabhaengig vom Status. Die bisherigen Jobangebot-Favoriten werden
durchgaengig entfernt (Endpoint, Migration, UI, Startseiten-Sektion), da
nur Bewerbungen gemerkt werden sollen.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-14 14:58:18 +02:00
co-authored by Claude
parent 3a108d3fec
commit fc1b68ebb4
9 changed files with 94 additions and 110 deletions
+20 -21
View File
@@ -1441,10 +1441,12 @@ async function initializeDatabase() {
// Favoriten-Merkmal (Stern): 0 = nicht gemerkt, 1 = favorisiert. Favoriten
// erscheinen oben auf der Startseite — unabhängig vom Status (offen /
// uebernommen / abgelehnt). Spalte wird nur bei Bedarf angelegt.
// Favoriten-Markierung für Bewerbungen. Erlaubt das Merken einzelner
// Bewerbungen, unabhängig von ihrem Status.
{
const jobSpalten = await dbAll('PRAGMA table_info(jobangebote)');
if (!jobSpalten.some((s) => s.name === 'favorit')) {
await exec('ALTER TABLE jobangebote ADD COLUMN favorit INTEGER NOT NULL DEFAULT 0');
const bewSpalten = await dbAll('PRAGMA table_info(bewerbungen)');
if (!bewSpalten.some((s) => s.name === 'favorit')) {
await exec('ALTER TABLE bewerbungen ADD COLUMN favorit INTEGER NOT NULL DEFAULT 0');
}
}
@@ -1754,14 +1756,13 @@ initializeDatabase().then(async () => {
};
}
// Gemerkte Stellen (Favoriten) für die Sektion ganz oben auf der
// Startseite — unabhängig vom Angebot-Status (offen/uebernommen/…).
const favoriten = await dbAll(
`SELECT j.id, j.firma, j.stelle, j.ort, j.status, j.quelle_url,
j.verknuepfte_bewerbung_id, j.gehalt, j.favorit
FROM jobangebote j
WHERE j.user_id = ? AND j.favorit = 1
ORDER BY j.updated_at DESC, j.id DESC`,
// Gemerkte Bewerbungen — unabhängig vom Bewerbungs-Status, ganz oben auf
// der Startseite.
const bewerbungFavoriten = await dbAll(
`SELECT b.id, b.firma, b.stelle, b.ort, b.status, b.datum, b.favorit
FROM bewerbungen b
WHERE b.user_id = ? AND b.favorit = 1
ORDER BY b.updated_at DESC, b.id DESC`,
[U]
);
@@ -1782,7 +1783,7 @@ initializeDatabase().then(async () => {
statusOptions: STATUS_OPTIONS,
labelOptions: LABEL_OPTIONS,
setupWizard,
favoriten
bewerbungFavoriten
});
} catch (error) {
console.error('Error:', error);
@@ -3624,18 +3625,16 @@ initializeDatabase().then(async () => {
}
});
// Favorit umschalten (Stern). JSON-Antwort, damit der Client den Stern
// sofort umschalten kann, ohne die Seite neu zu laden. Favoriten sind
// unabhängig vom Angebot-Status sichtbar — auch „uebernommen“ bleibt merkbar.
app.post('/jobangebote/:id/favorit', async (req, res) => {
// Bewerbung als Favorit merken/entmerken — unabhängig vom Bewerbungs-Status.
app.post('/api/bewerbungen/:id/favorit', async (req, res) => {
try {
const angebot = await dbGet('SELECT favorit FROM jobangebote WHERE id = ? AND user_id = ?', [req.params.id, uid()]);
if (!angebot) return res.status(404).json({ error: 'Jobangebot nicht gefunden' });
const neu = angebot.favorit ? 0 : 1;
await dbRun('UPDATE jobangebote SET favorit = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND user_id = ?', [neu, req.params.id, uid()]);
const bewerbung = await dbGet('SELECT favorit FROM bewerbungen WHERE id = ? AND user_id = ?', [req.params.id, uid()]);
if (!bewerbung) return res.status(404).json({ error: 'Bewerbung nicht gefunden' });
const neu = bewerbung.favorit ? 0 : 1;
await dbRun('UPDATE bewerbungen SET favorit = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND user_id = ?', [neu, req.params.id, uid()]);
res.json({ success: true, favorit: neu });
} catch (error) {
console.error('Error toggling favorite:', error);
console.error('Error toggling bewerbung favorite:', error);
res.status(500).json({ error: 'Serverfehler' });
}
});