import { Response } from 'express'; import { isValidIBAN } from 'ibantools'; 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; 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): * { valid: false } → Prüfziffer falsch (Tippfehler) * { valid: true, bic, bankName, blz } → gültig + DE-Bank gefunden * { valid: true, bic: null, bankName: null } → gültig, aber keine DE-Bankdaten * (Nicht-DE-IBAN oder unbekannte BLZ) */ export async function lookupIban(req: AuthRequest, res: Response): Promise { try { const raw = typeof req.body?.iban === 'string' ? req.body.iban : ''; const iban = raw.replace(/\s+/g, '').toUpperCase(); if (!iban) { res.status(400).json({ success: false, error: 'Feld IBAN ist erforderlich.' } as ApiResponse); return; } if (!isValidIBAN(iban)) { res.json({ success: true, data: { valid: false, iban } } as ApiResponse); return; } const country = iban.slice(0, 2); const bank = country === 'DE' ? blzData.lookupByIban(iban) : null; res.json({ success: true, data: { valid: true, iban, country, bic: bank?.bic ?? null, bankName: bank?.bankName ?? null, blz: bank?.blz ?? null, }, } as ApiResponse); } catch (error) { res.status(500).json({ success: false, error: error instanceof Error ? error.message : 'Fehler beim IBAN-Nachschlagen', } as ApiResponse); } }