- 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>
209 lines
8.6 KiB
Lua
209 lines
8.6 KiB
Lua
-- =====================================================================
|
|
-- aether-police — Rollen und Rechte
|
|
--
|
|
-- Rechte sind einzelne, benannte Schalter. Eine Rolle ist nur ein
|
|
-- Vorschlagspaket — jedes Recht kann pro Beamtem zusaetzlich gewaehrt
|
|
-- oder entzogen werden (Spalten `rechte_extra` / `rechte_entzug`).
|
|
-- =====================================================================
|
|
|
|
Polizei = Polizei or {}
|
|
|
|
-- ---------------------------------------------------------------------
|
|
-- Katalog aller Rechte
|
|
-- Gruppiert nur fuer die Darstellung in der Administration.
|
|
-- ---------------------------------------------------------------------
|
|
Polizei.Rechte = {
|
|
{ gruppe = 'Dienst', eintraege = {
|
|
{ id = 'dienst.antreten', name = 'Dienst antreten' },
|
|
{ id = 'dienst.leitstelle', name = 'Leitstelle übernehmen' },
|
|
{ id = 'dienst.spezial', name = 'Spezialdienst wählen' },
|
|
}},
|
|
{ gruppe = 'Personen & Fahrzeuge', eintraege = {
|
|
{ id = 'person.suchen', name = 'Personen suchen' },
|
|
{ id = 'person.bearbeiten', name = 'Personendaten bearbeiten' },
|
|
{ id = 'person.warnhinweis', name = 'Warnhinweise setzen' },
|
|
{ id = 'fahrzeug.suchen', name = 'Fahrzeuge abfragen' },
|
|
}},
|
|
{ gruppe = 'Akten & Berichte', eintraege = {
|
|
{ id = 'akte.lesen', name = 'Akten einsehen' },
|
|
{ id = 'akte.erstellen', name = 'Akten anlegen' },
|
|
{ id = 'akte.bearbeiten', name = 'Akten bearbeiten' },
|
|
{ id = 'akte.freigeben', name = 'Akten freigeben' },
|
|
{ id = 'akte.schliessen', name = 'Akten schließen' },
|
|
{ id = 'bericht.erstellen', name = 'Berichte schreiben' },
|
|
{ id = 'bericht.freigeben', name = 'Berichte freigeben' },
|
|
}},
|
|
{ gruppe = 'Maßnahmen', eintraege = {
|
|
{ id = 'anzeige.erstellen', name = 'Anzeige erfassen' },
|
|
{ id = 'anzeige.bestaetigen', name = 'Anzeige bestätigen' },
|
|
{ id = 'anzeige.abweichen', name = 'Vom Katalogvorschlag abweichen' },
|
|
{ id = 'gewahrsam.einweisen', name = 'In Gewahrsam nehmen' },
|
|
{ id = 'gewahrsam.entlassen', name = 'Aus Gewahrsam entlassen' },
|
|
{ id = 'fahndung.erstellen', name = 'Fahndung ausschreiben' },
|
|
{ id = 'fahndung.aufheben', name = 'Fahndung aufheben' },
|
|
}},
|
|
{ gruppe = 'Asservate & Beweise', eintraege = {
|
|
{ id = 'beweis.erfassen', name = 'Beweise erfassen' },
|
|
{ id = 'beweis.loeschen', name = 'Beweise entfernen' },
|
|
{ id = 'asservat.einlagern', name = 'Asservate einlagern' },
|
|
{ id = 'asservat.ausgeben', name = 'Asservate ausgeben' },
|
|
{ id = 'asservat.vernichten', name = 'Asservate vernichten' },
|
|
}},
|
|
{ gruppe = 'Einsätze', eintraege = {
|
|
{ id = 'einsatz.erstellen', name = 'Einsatz anlegen' },
|
|
{ id = 'einsatz.zuweisen', name = 'Einheiten zuweisen' },
|
|
{ id = 'einsatz.schliessen', name = 'Einsatz abschließen' },
|
|
}},
|
|
{ gruppe = 'Fahrzeugverwaltung', eintraege = {
|
|
{ id = 'dienstfahrzeug.sehen', name = 'Dienstfahrzeuge einsehen' },
|
|
{ id = 'dienstfahrzeug.zuweisen', name = 'Dienstfahrzeuge zuweisen' },
|
|
{ id = 'dienstfahrzeug.wartung', name = 'Wartungsstatus setzen' },
|
|
}},
|
|
{ gruppe = 'Kommunikation', eintraege = {
|
|
{ id = 'nachricht.senden', name = 'Nachrichten schreiben' },
|
|
{ id = 'nachricht.rundmeldung', name = 'Rundmeldung an alle senden' },
|
|
{ id = 'aushang.schreiben', name = 'Aushänge veröffentlichen' },
|
|
{ id = 'aushang.archivieren', name = 'Aushänge archivieren' },
|
|
}},
|
|
{ gruppe = 'Verwaltung', eintraege = {
|
|
{ id = 'personal.sehen', name = 'Personalliste einsehen' },
|
|
{ id = 'personal.rolle', name = 'Rollen zuweisen' },
|
|
{ id = 'personal.rechte', name = 'Einzelrechte vergeben' },
|
|
{ id = 'personal.einstellen', name = 'Personal einstellen/entlassen' },
|
|
{ id = 'katalog.bearbeiten', name = 'Strafenkatalog pflegen' },
|
|
{ id = 'protokoll.lesen', name = 'Protokoll einsehen' },
|
|
{ id = 'statistik.sehen', name = 'Statistik einsehen' },
|
|
{ id = 'admin.module', name = 'Module verwalten' },
|
|
}},
|
|
}
|
|
|
|
--- Liefert alle Rechte-IDs als flache Liste
|
|
--- @return table
|
|
function Polizei.AlleRechte()
|
|
local liste = {}
|
|
for _, gruppe in ipairs(Polizei.Rechte) do
|
|
for _, recht in ipairs(gruppe.eintraege) do
|
|
liste[#liste + 1] = recht.id
|
|
end
|
|
end
|
|
return liste
|
|
end
|
|
|
|
-- ---------------------------------------------------------------------
|
|
-- Rollen — aufsteigend nach Verantwortung
|
|
-- `rechte` ist ein Vorschlagspaket, kein festes Gesetz.
|
|
-- ---------------------------------------------------------------------
|
|
Polizei.Rollen = {
|
|
{
|
|
id = 'anwaerter', name = 'Anwärter', stufe = 0,
|
|
rechte = {
|
|
'dienst.antreten', 'person.suchen', 'fahrzeug.suchen',
|
|
'akte.lesen', 'einsatz.erstellen', 'dienstfahrzeug.sehen',
|
|
'nachricht.senden',
|
|
},
|
|
},
|
|
{
|
|
id = 'officer', name = 'Officer', stufe = 1,
|
|
rechte = {
|
|
'dienst.antreten', 'person.suchen', 'fahrzeug.suchen',
|
|
'akte.lesen', 'akte.erstellen', 'bericht.erstellen',
|
|
'anzeige.erstellen', 'beweis.erfassen',
|
|
'einsatz.erstellen', 'dienstfahrzeug.sehen', 'nachricht.senden',
|
|
},
|
|
},
|
|
{
|
|
id = 'senior_officer', name = 'Senior Officer', stufe = 2,
|
|
rechte = {
|
|
'dienst.antreten', 'person.suchen', 'person.bearbeiten', 'fahrzeug.suchen',
|
|
'akte.lesen', 'akte.erstellen', 'akte.bearbeiten',
|
|
'bericht.erstellen', 'anzeige.erstellen', 'anzeige.bestaetigen',
|
|
'beweis.erfassen', 'asservat.einlagern',
|
|
'einsatz.erstellen', 'einsatz.schliessen', 'dienstfahrzeug.sehen',
|
|
'nachricht.senden',
|
|
},
|
|
},
|
|
{
|
|
id = 'sergeant', name = 'Sergeant', stufe = 3,
|
|
rechte = {
|
|
'dienst.antreten', 'dienst.leitstelle', 'dienst.spezial',
|
|
'person.suchen', 'person.bearbeiten', 'person.warnhinweis', 'fahrzeug.suchen',
|
|
'akte.lesen', 'akte.erstellen', 'akte.bearbeiten', 'akte.schliessen',
|
|
'bericht.erstellen', 'anzeige.erstellen', 'anzeige.bestaetigen',
|
|
'gewahrsam.einweisen', 'gewahrsam.entlassen',
|
|
'fahndung.erstellen', 'fahndung.aufheben',
|
|
'beweis.erfassen', 'asservat.einlagern', 'asservat.ausgeben',
|
|
'einsatz.erstellen', 'einsatz.zuweisen', 'einsatz.schliessen',
|
|
'dienstfahrzeug.sehen', 'dienstfahrzeug.zuweisen',
|
|
'nachricht.senden', 'nachricht.rundmeldung',
|
|
},
|
|
},
|
|
{
|
|
id = 'lieutenant', name = 'Lieutenant', stufe = 4,
|
|
erbt = 'sergeant',
|
|
rechte = {
|
|
'akte.freigeben', 'bericht.freigeben', 'anzeige.abweichen',
|
|
'personal.sehen', 'statistik.sehen', 'dienstfahrzeug.wartung',
|
|
'aushang.schreiben',
|
|
},
|
|
},
|
|
{
|
|
id = 'captain', name = 'Captain', stufe = 5,
|
|
erbt = 'lieutenant',
|
|
rechte = {
|
|
'personal.rolle', 'beweis.loeschen', 'asservat.vernichten',
|
|
'protokoll.lesen', 'aushang.archivieren',
|
|
},
|
|
},
|
|
{
|
|
id = 'deputy_chief', name = 'Deputy Chief', stufe = 6,
|
|
erbt = 'captain',
|
|
rechte = { 'personal.rechte', 'personal.einstellen', 'katalog.bearbeiten' },
|
|
},
|
|
{
|
|
id = 'chief', name = 'Chief of Police', stufe = 7,
|
|
erbt = 'deputy_chief',
|
|
rechte = { 'admin.module' },
|
|
},
|
|
}
|
|
|
|
--- Sucht eine Rolle
|
|
--- @param rollenId string Kennung
|
|
--- @return table|nil
|
|
function Polizei.HoleRolle(rollenId)
|
|
for _, rolle in ipairs(Polizei.Rollen) do
|
|
if rolle.id == rollenId then return rolle end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
--- Loest die Rechte einer Rolle auf (inklusive Vererbung)
|
|
--- @param rollenId string Kennung
|
|
--- @return table Menge der Rechte { [rechtId] = true }
|
|
function Polizei.RechteDerRolle(rollenId)
|
|
local menge = {}
|
|
local besucht = {}
|
|
local aktuelle = rollenId
|
|
|
|
-- Vererbungskette abarbeiten; Zyklen werden abgefangen
|
|
while aktuelle and not besucht[aktuelle] do
|
|
besucht[aktuelle] = true
|
|
local rolle = Polizei.HoleRolle(aktuelle)
|
|
if not rolle then break end
|
|
|
|
for _, recht in ipairs(rolle.rechte or {}) do
|
|
menge[recht] = true
|
|
end
|
|
aktuelle = rolle.erbt
|
|
end
|
|
|
|
return menge
|
|
end
|
|
|
|
--- Liefert die Stufe einer Rolle (fuer Vergleiche „darf ich das bei dem?")
|
|
--- @param rollenId string Kennung
|
|
--- @return number
|
|
function Polizei.Stufe(rollenId)
|
|
local rolle = Polizei.HoleRolle(rollenId)
|
|
return rolle and rolle.stufe or -1
|
|
end
|