4.6 KiB
4.6 KiB
d4rk_tablet — Behörden-MDT / CAD
Eigenständige Behörden-Software (MDT/CAD) für FiveM. Läuft unabhängig vom Game-Server: im Spiel (NUI-iframe) und im Browser (Leitstelle, 2. Monitor, echtes Tablet).
Das komplette System lebt im Backend/Web. Bürger & Fahrzeuge werden MDT-eigen geführt (nicht aus QBox gelesen) — so lassen sich auch illegale Einreise, unbekannte Täter (John Doe) und gefälschte Kennzeichen sauber abbilden.
Architektur
apps/tablet-web React 18 + Vite 5 + Tailwind 4 + Zustand + TanStack Query + Lucide
backend/api Fastify + Drizzle ORM (mysql2) + Socket.io → liest QBox-MariaDB direkt
fivem-bridge minimale Lua-Resource (Token, NUI, Positionen, Waypoint)
packages/shared TS-DTOs (zod) + Socket-Events + RBAC — von web & backend genutzt
Setup
pnpm install # Node >=20, pnpm 10
cp .env.example .env # DB-Creds, JWT-, HMAC-, Discord-Secrets eintragen
pnpm dev # startet web (5173) + api (3000) via Turborepo
Weitere Scripts: pnpm typecheck, pnpm build, pnpm db:generate, pnpm db:migrate.
Datenbank
- Komplett eigenständig: alle Daten in eigenen
mdt_*-Tabellen (Migrations via Drizzle Kit). - Bürger (
mdt_citizens) und Fahrzeuge (mdt_vehicles) werden von der Behörde selbst geführt — QBox-Tabellen werden nicht mehr gelesen (bewusste Entscheidung für Hardcore-RP).
Milestones
- ✅ Scaffold — Monorepo, shared DTOs, Fastify + Vite Skelett, Drizzle-Setup
- ✅ Auth — JWT + RBAC-Guards,
/auth/fivem(HMAC), Discord OAuth, Dev-Login - ✅ Personen + Fahrzeuge — QBox-Reads (JSON-Parsing), REST + RBAC, TanStack-Query-UI. Siehe docs/dev-setup.md für Seed + Live-Test
- ✅ Strafakten / Haftbefehle — Strafenkatalog, Akte anlegen (Charges × Anzahl → Summe Bußgeld/Haft), Haftbefehl ausstellen/aufheben. Behörden-Branding + Tablet-Statusbar.
- ✅ Realtime-Dispatch + Map — Socket.io (JWT-Auth, Dept-Rooms), Einsätze live, Officer-Positionen live. MapLibre GTA-Satelliten-Map (Tiles served vom Backend
/tiles/, Game→lng/lat-Projektion). HMAC-Bridge-Endpoints (/bridge/*). - ✅ Rechte & Mitarbeiter — Hybrid-Rechte (granulare Nodes, QBox-Rang-Matrix ∪ Overrides, ins JWT gebacken). Visueller Rechte-Explorer (Baum MDT/CAD/Admin, Tri-State, Suche, Rollen-Templates) + Mitarbeiter-Verwaltung. Guards prüfen
permissions. - ✅ FiveM-Bridge — Lua-Resource (
fivem-bridge/): Tablet öffnen (NUI-iframe + Token via postMessage), Server-Token-Flow (Shared-Secret), server-seitiger Positions-Push, Dienst-Sync, Dispatch-Export, Waypoint. Siehe docs/fivem-bridge.md. Backend-Contract verifiziert; Lua-Ingame-Test beim Betreiber. - 🚧 Weitere Module (aus EMS-MDT-Vorlage): ✅ Start-Dashboard (Uhr, Termine, Schwarzes Brett) · ✅ Dokumente (Ordner + Tiptap Rich-Text [Tabellen/Aufgabenlisten/Link/Bild/…], Aktenzeichen
DO-JJJJ-MM-TT-###) · ✅ Bürgerakten (MDT-eigene, voll editierbare Bürger-Registry: anlegen/bearbeiten/löschen, Mugshot-URL, Aufenthaltsstatus inkl. illegaler Einreise, Aliasse, Personenbeschreibung, Lizenzen, Fahndung) · ✅ Fahrzeug-Registry (MDT-eigen: anlegen/bearbeiten/löschen, Halter-Verknüpfung, Kennzeichen-Status registriert/gefälscht/gestohlen) · ✅ EMS-Behandlungsakten (Pendant zu Strafakten: Patient-Suche, AktenzeichenTR-JJJJ-MM-TT-###, Diagnose + Behandlung als Tiptap Rich-Text, offen/abgeschlossen) · ✅ Gesetze (Strafgesetzbuch-Nachschlagewerk: nach Kategorie gruppiert, durchsuchbar, Gesetzestext als Tiptap Rich-Text + Bußgeld/Haftzeit, pflegbar mitmdt.laws.manage) · ✅ Kalender (echte Monatsansicht, Termine/Events mit Kategorie-Farben, Einladung einzelner/mehrerer Personen, Selbst-Eintragung + RSVP [Zusage/Absage/Vielleicht], Tiptap-Beschreibung) · ⬜ Mein Profil · ⬜ Dispatch-Units - ✅ Freigabe-System (ACL) — konfigurierbare Behörden-Registry + Gruppen/Teams + modernes Freigabe-Panel (Lesen/Schreiben × Behörden/Gruppen/Personen, öffentlich-Toggle) auf Dokumenten/Ordnern und Bürgerakten (dort als Sichtbarkeits-ACL: welche Behörde sieht welche Akte). Verwaltung: Rechte-Matrix · Mitarbeiter · Behörden · Gruppen.
- ⬜ Feature-Flags · Dienststatus-Gating · Ownership · Temporär/Vertretung · Audit-Log · Deployment
Dev-Hinweise
- Browser-Dev ohne Login:
VITE_DEV_AUTH_BYPASS=truein.env→ Mock-Officer (police, admin). - Auth-Token kommt im NUI per
postMessage({ action: 'auth', token, user }).