v1.3: Serverseitige Datenbank (PostgreSQL + Node-API) ersetzt localStorage
- server/: Express-API (Auth, Bootstrap, Tickets, Threads, Benutzerverwaltung, Codes) mit pg-Schema (11 Tabellen), idempotem Seed (50 Wohnungen, 552 Buchungen) - mp-db (PostgreSQL 16, Volume mp_pgdata) + mp-api im Compose-Stack, nginx proxiet /api/ an mp-api; deploy.sh baut API-Image auf dem Server - Frontend: Store laedt /api/bootstrap, Schreibzugriff async, kein localStorage mehr (ausser Theme), Ladebildschirm beim Session-Check, vite-Proxy fuer Dev - Rollenrechte serverseitig: Mieter nur eigene Wohnung (getestet, 403-Verweis) - Mail-Benachrichtigungen komplett serverseitig (server/src/mail.js) - beispieldaten.py schreibt server/seed/generated.json; Verwaltungs-Mail = axel@hocks.eu - E2E live verifiziert: Login, Scoping, Ticket + Zustellung (status=sent), Registrierung, Codes; Testdaten bereinigt; Doku nachgefuehrt
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
/** Serverseitiger E-Mail-Versand über die Portal-Mail-API (mp-mail-api).
|
||||
*
|
||||
* Fire-and-forget: Ein Fehler (Mail-API down, Relay-Fehler) beeinträchtigt
|
||||
* die auslösende Portal-Aktion nie. Die Mail-API selbst puffert im Fehlerfall
|
||||
* in ihrer Outbox und versucht es erneut.
|
||||
*/
|
||||
|
||||
const MAIL_API_URL = process.env.MAIL_API_URL || '' // z. B. http://mp-mail-api:8080
|
||||
const MAIL_API_TOKEN = process.env.MAIL_API_TOKEN || ''
|
||||
|
||||
const FUSSZEILE =
|
||||
'\n\n— Automatische Benachrichtigung aus dem Mieterportal der Hinterstein Immobilien'
|
||||
|
||||
async function sendeMail(an, betreff, text) {
|
||||
if (!MAIL_API_URL || !MAIL_API_TOKEN || !an) return
|
||||
try {
|
||||
const res = await fetch(`${MAIL_API_URL}/send`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json', 'X-Api-Token': MAIL_API_TOKEN },
|
||||
body: JSON.stringify({ to: an, subject: betreff, text: `${text}${FUSSZEILE}` }),
|
||||
})
|
||||
if (!res.ok) console.warn(`[mail] Versand an ${an} fehlgeschlagen: HTTP ${res.status}`)
|
||||
} catch (e) {
|
||||
console.warn(`[mail] Versand an ${an} fehlgeschlagen:`, e.message)
|
||||
}
|
||||
}
|
||||
|
||||
/** Alle aktiven Verwaltungsnutzer benachrichtigen. */
|
||||
async function benachrichtigeVerwaltung(betreff, text) {
|
||||
const { rows } = await require('./db').pool.query(
|
||||
`SELECT email FROM users WHERE rolle = 'verwaltung' AND aktiv AND email <> ''`,
|
||||
)
|
||||
for (const r of rows) sendeMail(r.email, betreff, text)
|
||||
}
|
||||
|
||||
/** Mieter einer bestimmten Wohnung benachrichtigen. */
|
||||
async function benachrichtigeMieter(einheitId, betreff, text) {
|
||||
const { rows } = await require('./db').pool.query(
|
||||
`SELECT email FROM users WHERE rolle = 'mieter' AND aktiv AND einheit_id = $1 AND email <> ''`,
|
||||
[einheitId],
|
||||
)
|
||||
for (const r of rows) sendeMail(r.email, betreff, text)
|
||||
}
|
||||
|
||||
function einheitLabel(u) {
|
||||
return u ? `${u.building}, Whg. ${u.number}` : ''
|
||||
}
|
||||
|
||||
module.exports = { sendeMail, benachrichtigeVerwaltung, benachrichtigeMieter, einheitLabel }
|
||||
Reference in New Issue
Block a user