- 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>
78 lines
2.9 KiB
Lua
78 lines
2.9 KiB
Lua
-- =====================================================================
|
|
-- aether-admin / Modul: Admin-Team
|
|
--
|
|
-- Das Team ist keine eigene Liste — es sind die Benutzer in
|
|
-- `aether_users` mit einer Gruppe über `user`. Rollen zu vergeben heißt
|
|
-- hier, die Gruppe eines Benutzers zu ändern; der Core respektiert sie
|
|
-- ab dann überall.
|
|
-- =====================================================================
|
|
|
|
Admin = Admin or {}
|
|
|
|
-- Nur diese Gruppen sind vergebbar (owner nur von owner — via Rechte-Matrix)
|
|
local ROLLEN = { 'support', 'admin', 'owner' }
|
|
|
|
--- Ist eine Gruppenkennung gültig?
|
|
local function GueltigeRolle(g)
|
|
for _, r in ipairs(ROLLEN) do if r == g then return true end end
|
|
return false
|
|
end
|
|
|
|
Admin.Kern.Registriere('team', 'laden', function(handelnder, daten)
|
|
local zeilen = MySQL.query.await([[
|
|
SELECT license, name, admin_group FROM aether_users
|
|
WHERE admin_group <> 'user'
|
|
ORDER BY FIELD(admin_group,'owner','admin','support'), name
|
|
]]) or {}
|
|
|
|
-- Wer davon ist online?
|
|
local onlineLizenz = {}
|
|
for _, sid in ipairs(GetPlayers() or {}) do
|
|
onlineLizenz[Admin.Auth.Lizenz(tonumber(sid))] = true
|
|
end
|
|
for _, z in ipairs(zeilen) do z.online = onlineLizenz[z.license] and true or false end
|
|
|
|
return { team = zeilen, rollen = ROLLEN,
|
|
rechte = Admin.Kern.RechteAbbild(handelnder.quelle) }
|
|
end)
|
|
|
|
Admin.Kern.Registriere('team', 'speichern', function(handelnder, daten)
|
|
local rolle = tostring(daten.rolle or '')
|
|
if not GueltigeRolle(rolle) then return nil, 'Unbekannte Rolle.' end
|
|
|
|
-- Nur ein Owner darf Owner-Rechte vergeben
|
|
if rolle == 'owner' and not Admin.Auth.Hat(handelnder.quelle, 'owner') then
|
|
return nil, 'Owner-Rechte darf nur ein Owner vergeben.'
|
|
end
|
|
|
|
-- Ziel über Lizenz oder Namenssuche bestimmen
|
|
local lizenz = daten.lizenz and tostring(daten.lizenz) or nil
|
|
if not lizenz then
|
|
local treffer = Admin.DB.SucheBenutzer(tostring(daten.name or ''))
|
|
if #treffer == 0 then return nil, 'Kein Benutzer gefunden.' end
|
|
if #treffer > 1 then return nil, 'Mehrdeutig — bitte die Lizenz angeben.' end
|
|
lizenz = treffer[1].license
|
|
end
|
|
|
|
if not Admin.DB.SetzeGruppe(lizenz, rolle) then
|
|
return nil, 'Benutzer nicht gefunden.'
|
|
end
|
|
Admin.Auth.CacheLeerenNachLizenz(lizenz)
|
|
|
|
Admin.Log.Schreibe(handelnder, 'Rolle vergeben', daten.name or lizenz, rolle)
|
|
return { ok = true }
|
|
end)
|
|
|
|
Admin.Kern.Registriere('team', 'entfernen', function(handelnder, daten)
|
|
local lizenz = tostring(daten.lizenz or '')
|
|
if lizenz == '' then return nil, 'Keine Lizenz angegeben.' end
|
|
if lizenz == handelnder.lizenz then
|
|
return nil, 'Du kannst dir nicht selbst die Rechte entziehen.'
|
|
end
|
|
|
|
Admin.DB.SetzeGruppe(lizenz, 'user')
|
|
Admin.Auth.CacheLeerenNachLizenz(lizenz)
|
|
Admin.Log.Schreibe(handelnder, 'Aus dem Team entfernt', daten.name or lizenz)
|
|
return { ok = true }
|
|
end)
|