aether-framework/resources/[aether]/aether-medical/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
2.0 KiB
Lua

-- =====================================================================
-- aether-medical — Rechteprüfung
--
-- Ein Mitarbeiter 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 Mitarbeiters
--- @param personal table Zeile aus medical_personal
--- @return table { [rechtId] = true }
function Rechte.Berechne(personal)
local menge = Medizin.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 mitarbeiter table Mitarbeiterdaten (mit Feld `rechte`)
--- @param recht string Recht-Kennung
--- @return boolean
function Rechte.Hat(mitarbeiter, recht)
if not mitarbeiter or not mitarbeiter.rechte then return false end
if not recht then return true end
return mitarbeiter.rechte[recht] == true
end
--- Prüft, ob ein Mitarbeiter über einem anderen steht.
--- Verhindert, dass jemand Gleichrangige oder Höhere verwaltet.
--- @param mitarbeiter table Handelnder
--- @param zielRolle string Rolle der Zielperson
--- @return boolean
function Rechte.StehtUeber(mitarbeiter, zielRolle)
return Medizin.Stufe(mitarbeiter.rolle) > Medizin.Stufe(zielRolle)
end