aether-framework/resources/[aether]/aether-police/server/rechte.lua
Jerrit Fritzsche e4b82dd685 Aether-Framework: Fachmodule, Admin-Panel und Docker-Datenbank
- aether-medical: Stationen/Belegung, Intensivstation, Blutbank, Fuhrpark,
  Nachrichten/Aushänge, Berichte und Textbausteine (server + NUI)
- aether-admin: vollständiges Server-Admin-Panel als echtes FiveM-Resource,
  an aether-core gekoppelt (Rechte über aether_users.admin_group), mit
  WebRTC-Live-Kameras (Bildschirmfreigabe) und separatem Media-Server (SFU)
- Prototypen admin/ vervollständigt
- SQL-Schema aether_admin.sql
- Docker-Compose mit MariaDB und idempotenter Auto-Migration (schema_migrations)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-27 18:55:32 +02:00

62 lines
1.9 KiB
Lua

-- =====================================================================
-- aether-police — Rechteprüfung
--
-- Ein Beamter hat ein Recht, wenn seine Rolle es vorsieht ODER es ihm
-- einzeln gewährt wurde — und es ihm nicht einzeln entzogen wurde.
-- Der Entzug hat immer Vorrang.
-- =====================================================================
Rechte = {}
--- Wandelt eine JSON-Liste in eine Menge um
--- @param roh string|nil JSON-Array
--- @return table { [wert] = true }
local function ZuMenge(roh)
local menge = {}
if not roh then return menge end
local erfolg, liste = pcall(json.decode, roh)
if erfolg and type(liste) == 'table' then
for _, wert in ipairs(liste) do menge[wert] = true end
end
return menge
end
--- Baut die vollständige Rechtemenge eines Beamten
--- @param personal table Zeile aus police_personal
--- @return table { [rechtId] = true }
function Rechte.Berechne(personal)
local menge = Polizei.RechteDerRolle(personal.rolle)
-- Einzeln gewährte Rechte ergänzen
for recht in pairs(ZuMenge(personal.rechte_extra)) do
menge[recht] = true
end
-- Einzeln entzogene Rechte haben Vorrang
for recht in pairs(ZuMenge(personal.rechte_entzug)) do
menge[recht] = nil
end
return menge
end
--- Prüft ein einzelnes Recht
--- @param beamter table Beamtendaten (mit Feld `rechte`)
--- @param recht string Recht-Kennung
--- @return boolean
function Rechte.Hat(beamter, recht)
if not beamter or not beamter.rechte then return false end
if not recht then return true end
return beamter.rechte[recht] == true
end
--- Prüft, ob ein Beamter über einem anderen steht.
--- Verhindert, dass jemand Gleichrangige oder Höhere verwaltet.
--- @param beamter table Handelnder
--- @param zielRolle string Rolle der Zielperson
--- @return boolean
function Rechte.StehtUeber(beamter, zielRolle)
return Polizei.Stufe(beamter.rolle) > Polizei.Stufe(zielRolle)
end