v1.20: Mieter pflegen eigene Stammdaten (Telefon, E-Mail, Bankverbindung)

This commit is contained in:
2026-10-04 13:21:47 +02:00
parent 1385e349f2
commit 26372d563c
8 changed files with 265 additions and 0 deletions
+5
View File
@@ -106,6 +106,11 @@ CREATE TABLE IF NOT EXISTS users (
erstellt_am TEXT NOT NULL,
letzter_login TEXT
);
-- Stammdaten zur Selbstpflege durch den Nutzer (v1.20)
ALTER TABLE users ADD COLUMN IF NOT EXISTS telefon TEXT;
ALTER TABLE users ADD COLUMN IF NOT EXISTS kontoinhaber TEXT;
ALTER TABLE users ADD COLUMN IF NOT EXISTS iban TEXT;
ALTER TABLE users ADD COLUMN IF NOT EXISTS bankname TEXT;
CREATE TABLE IF NOT EXISTS registration_codes (
code TEXT PRIMARY KEY,
+29
View File
@@ -135,6 +135,10 @@ const oeffentlicherBenutzer = (b) => ({
aktiv: b.aktiv,
erstelltAm: b.erstellt_am,
letzterLogin: b.letzter_login ?? undefined,
telefon: b.telefon ?? null,
kontoinhaber: b.kontoinhaber ?? null,
iban: b.iban ?? null,
bankname: b.bankname ?? null,
})
async function sessionAnlegen(res, userId, req) {
@@ -238,6 +242,31 @@ app.get('/api/auth/me', auth, (req, res) => {
res.json({ benutzer: oeffentlicherBenutzer(req.user) })
})
// Stammdaten-Selbstpflege (v1.20): Telefon, E-Mail, Bankverbindung
app.patch('/api/auth/profil', auth, async (req, res, next) => {
try {
const { email, telefon, kontoinhaber, iban, bankname } = req.body || {}
const emailNeu = String(email || '').trim()
if (!/^\S+@\S+\.\S+$/.test(emailNeu))
return res.status(400).json({ fehler: 'Gültige E-Mail-Adresse erforderlich.' })
const { rows: fremde } = await pool.query(
'SELECT id FROM users WHERE lower(email) = lower($1) AND id <> $2', [emailNeu, req.user.id],
)
if (fremde.length)
return res.status(400).json({ fehler: 'Diese E-Mail-Adresse wird bereits verwendet.' })
const ibanNeu = String(iban || '').trim().replace(/\s+/g, '').toUpperCase()
if (ibanNeu && !/^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$/.test(ibanNeu))
return res.status(400).json({ fehler: 'Ungültige IBAN.' })
const { rows } = await pool.query(
`UPDATE users SET email = $1, telefon = $2, kontoinhaber = $3, iban = $4, bankname = $5
WHERE id = $6 RETURNING *`,
[emailNeu, String(telefon || '').trim() || null, String(kontoinhaber || '').trim() || null,
ibanNeu || null, String(bankname || '').trim() || null, req.user.id],
)
res.json({ benutzer: oeffentlicherBenutzer(rows[0]) })
} catch (e) { next(e) }
})
app.post('/api/auth/register', async (req, res, next) => {
try {
const { code, benutzername, name, email, passwortHash } = req.body || {}