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:
2026-10-02 12:54:44 +02:00
parent 5503ce5fc5
commit 311153b3c3
26 changed files with 8873 additions and 894 deletions
+15 -2
View File
@@ -9,14 +9,27 @@ import Documents from './pages/Documents'
import Messages from './pages/Messages'
import BenutzerVerwaltung from './pages/BenutzerVerwaltung'
function Ladebildschirm() {
return (
<div className="flex min-h-screen items-center justify-center bg-[#22333b]">
<div className="text-center text-slate-300">
<div className="text-lg font-semibold text-white">Hinterstein Immobilien</div>
<div className="mt-1 text-sm">Mieterportal wird geladen …</div>
</div>
</div>
)
}
function RequireAuth({ children }: { children: React.ReactElement }) {
const { me } = useStore()
const { me, bereit } = useStore()
if (!bereit) return <Ladebildschirm />
if (!me) return <Navigate to="/login" replace />
return children
}
function LoginGate() {
const { me } = useStore()
const { me, bereit } = useStore()
if (!bereit) return <Ladebildschirm />
if (me) return <Navigate to="/" replace />
return <Login />
}