BLZ-Bankdaten: Laufzeit-Auto-Update ins Volume + Einstellungen-Seite
Statt npm-Rebuild-Wartung aktualisiert sich der Bankleitzahlen-Datensatz jetzt zur Laufzeit. Ein Scheduler (taeglich 03:30 + Catch-up 90s) prueft gemaess konfigurierbarem Intervall und laedt current.json/next.json von npm/jsDelivr (Paket bankdata-germany) in das neue Bind-Mount-Volume BANKDATA_DIR (./data/bankdata -> /app/bankdata). Lookup bevorzugt den Volume-Datensatz vor den ins Image gebackenen Daten (Fallback). Es wird kein Fremdcode ausgefuehrt - nur JSON gelesen und die current+next-Delta-Logik nachgebaut. Validierung (>=1000 Eintraege, Format) + atomarer Write (tmp+rename) schuetzen den guten Stand vor Muell. Datenschutz: Der Updater sendet keine Kundendaten, laedt nur eine oeffentliche Datendatei; abschaltbar; bei Fehler/ohne Egress greift Builtin. Neue Einstellungen-Seite /settings/bank-data zeigt Datenstand, Update- Verfuegbarkeit und bietet "Jetzt aktualisieren" + Auto-Update-Schalter + Intervall. Endpoints GET /api/settings/blz, POST /api/settings/blz/update-now. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,13 +1,14 @@
|
||||
import { Response } from 'express';
|
||||
import { isValidIBAN } from 'ibantools';
|
||||
import { bankDataByIBAN } from 'bankdata-germany';
|
||||
import * as blzData from '../services/blzData.service.js';
|
||||
import { ApiResponse, AuthRequest } from '../types/index.js';
|
||||
|
||||
/**
|
||||
* IBAN-Lookup: prüft die Prüfziffer (mod-97, offline über ibantools) und liefert
|
||||
* – für deutsche IBANs – BIC und Banknamen aus der Bundesbank-Bankleitzahlen-
|
||||
* datei (offline über bankdata-germany). Die IBAN verlässt NICHT den Server; es
|
||||
* findet KEIN externer Request statt. Zurückgegeben werden nur öffentliche
|
||||
* datei (offline; siehe blzData.service – Volume-Datensatz bevorzugt, sonst die
|
||||
* ins Image gebackenen Daten). Die IBAN verlässt NICHT den Server; es findet
|
||||
* KEIN externer Request statt. Zurückgegeben werden nur öffentliche
|
||||
* Bankverzeichnis-Daten (BIC/Name), keine kundenbezogenen Informationen.
|
||||
*
|
||||
* Antwortformen (immer HTTP 200, sofern eine IBAN übergeben wurde):
|
||||
@@ -32,7 +33,7 @@ export async function lookupIban(req: AuthRequest, res: Response): Promise<void>
|
||||
}
|
||||
|
||||
const country = iban.slice(0, 2);
|
||||
const bank = country === 'DE' ? bankDataByIBAN(iban) : null;
|
||||
const bank = country === 'DE' ? blzData.lookupByIban(iban) : null;
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
import { Response } from 'express';
|
||||
import { ApiResponse, AuthRequest } from '../types/index.js';
|
||||
import { logChange } from '../services/audit.service.js';
|
||||
import * as blzData from '../services/blzData.service.js';
|
||||
|
||||
// Status der BLZ-/Bankdaten (installierte Version, Quelle, Auto-Update-Stand).
|
||||
export async function getStatus(req: AuthRequest, res: Response): Promise<void> {
|
||||
try {
|
||||
const status = await blzData.getStatus();
|
||||
res.json({ success: true, data: status } as ApiResponse);
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error instanceof Error ? error.message : 'Fehler beim Laden des BLZ-Status',
|
||||
} as ApiResponse);
|
||||
}
|
||||
}
|
||||
|
||||
// Jetzt prüfen/aktualisieren (manueller Trigger). ?force=1 lädt auch bei
|
||||
// gleicher Version neu.
|
||||
export async function updateNow(req: AuthRequest, res: Response): Promise<void> {
|
||||
try {
|
||||
const force = req.query.force === '1' || req.query.force === 'true';
|
||||
const result = await blzData.runUpdate(force);
|
||||
await logChange({
|
||||
req,
|
||||
action: 'UPDATE',
|
||||
resourceType: 'AppSetting',
|
||||
resourceId: 'blz-data',
|
||||
label: `BLZ-Bankdaten: ${result.message}`,
|
||||
});
|
||||
const status = await blzData.getStatus();
|
||||
res.json({ success: true, data: { result, status } } as ApiResponse);
|
||||
} catch (error) {
|
||||
res.status(502).json({
|
||||
success: false,
|
||||
error: error instanceof Error ? error.message : 'BLZ-Aktualisierung fehlgeschlagen',
|
||||
} as ApiResponse);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user