diff --git a/lib/api.js b/lib/api.js index 79d1e89..4249bd7 100644 --- a/lib/api.js +++ b/lib/api.js @@ -537,6 +537,7 @@ function createExternalApi(deps) { const quelle = sanitizeInput(b.quelle || 'drittanbieter'); const externalId = b.external_id != null ? sanitizeInput(String(b.external_id)) : null; const anzeigeDatum = sanitizeInput(b.anzeige_datum || ''); + const kontaktEmail = sanitizeInput(b.kontakt_email || ''); const fields = [ sanitizeInput(b.firma), sanitizeInput(b.stelle), @@ -546,6 +547,7 @@ function createExternalApi(deps) { sanitizeInput(b.quelle_url || ''), sanitizeInput(b.art || ''), anzeigeDatum, + kontaktEmail, sanitizeInput(b.status || 'offen'), ]; @@ -558,7 +560,7 @@ function createExternalApi(deps) { if (existing) { await dbRun( `UPDATE jobangebote SET firma = ?, stelle = ?, ort = ?, gehalt = ?, - beschreibung = ?, quelle_url = ?, art = ?, anzeige_datum = ?, status = ?, + beschreibung = ?, quelle_url = ?, art = ?, anzeige_datum = ?, kontakt_email = ?, status = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?`, [...fields, existing.id] ); @@ -569,8 +571,8 @@ function createExternalApi(deps) { const result = await dbRun( `INSERT INTO jobangebote - (external_id, quelle, firma, stelle, ort, gehalt, beschreibung, quelle_url, art, anzeige_datum, status) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + (external_id, quelle, firma, stelle, ort, gehalt, beschreibung, quelle_url, art, anzeige_datum, kontakt_email, status) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [externalId, quelle, ...fields] ); const row = await dbGet('SELECT * FROM jobangebote WHERE id = ?', [result.lastID]); diff --git a/lib/openapi.js b/lib/openapi.js index 719a8f6..a39bcef 100644 --- a/lib/openapi.js +++ b/lib/openapi.js @@ -785,6 +785,7 @@ function buildOpenApiSpec(baseUrl = '') { quelle_url: { type: 'string', nullable: true }, art: { type: 'string', nullable: true }, anzeige_datum: { type: 'string', format: 'date', nullable: true, description: 'Datum der eigentlichen Stellenanzeige (vom Drittanbieter übergeben)' }, + kontakt_email: { type: 'string', format: 'email', nullable: true, description: 'Kontakt-E-Mail-Adresse der Stelle' }, status: { type: 'string', enum: ['offen', 'uebernommen', 'abgelehnt'] }, verknuepfte_bewerbung_id: { type: 'integer', nullable: true }, created_at: { type: 'string', format: 'date-time' }, @@ -805,6 +806,7 @@ function buildOpenApiSpec(baseUrl = '') { quelle_url: { type: 'string' }, art: { type: 'string', enum: ART_OPTIONS }, anzeige_datum: { type: 'string', format: 'date', description: 'Datum der eigentlichen Stellenanzeige (ISO YYYY-MM-DD)' }, + kontakt_email: { type: 'string', format: 'email', description: 'Kontakt-E-Mail-Adresse der Stelle' }, status: { type: 'string', enum: ['offen', 'uebernommen', 'abgelehnt'], default: 'offen' }, }, }, diff --git a/server.js b/server.js index 59f6ffd..93f5e60 100644 --- a/server.js +++ b/server.js @@ -620,6 +620,7 @@ function initializeDatabase() { quelle_url TEXT, art TEXT, anzeige_datum DATE, + kontakt_email TEXT, status TEXT NOT NULL DEFAULT 'offen', verknuepfte_bewerbung_id INTEGER, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, @@ -628,8 +629,9 @@ function initializeDatabase() { FOREIGN KEY (verknuepfte_bewerbung_id) REFERENCES bewerbungen(id) ON DELETE SET NULL ) `); - // Migration: add anzeige_datum to pre-existing jobangebote tables. + // Migration: add columns to pre-existing jobangebote tables. db.run('ALTER TABLE jobangebote ADD COLUMN anzeige_datum DATE', () => {}); + db.run('ALTER TABLE jobangebote ADD COLUMN kontakt_email TEXT', () => {}); // Remember the last recipient address per application (prefill). db.run('ALTER TABLE bewerbungen ADD COLUMN email_empfaenger TEXT', () => {}); diff --git a/views/jobangebote.ejs b/views/jobangebote.ejs index 344f50f..169ce5a 100644 --- a/views/jobangebote.ejs +++ b/views/jobangebote.ejs @@ -71,6 +71,13 @@ <%= j.quelle_url %> <% } %> + <% if (j.kontakt_email) { %> + + + <%= j.kontakt_email %> + + <% } %>
<% if (j.anzeige_datum) { %>
@@ -156,7 +163,8 @@
"beschreibung": "…",
"quelle_url": "https://acme.example/job/12345",
"art": "Online-Portal",
- "anzeige_datum": "2026-07-01"
+ "anzeige_datum": "2026-07-01",
+ "kontakt_email": "bewerbung@acme.example"
// "created_at" (Einspielung) NICHT mitsenden — wird vom Server automatisch gesetzt.
}'
Wiederholtes Senden mit derselben quelle + external_id aktualisiert das Angebot (Upsert). Die Doku/Swagger-UI liegt unter /swagger.