aether-framework/resources/[aether]/aether-admin/server/module/team.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

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)