Naechste "Ausbaustufe" aus Dogfather_VanVan_Supporter_Abo.odt Abschnitt 20 (siehe Supporter-Abo-System.md), auf Nutzerwunsch "perfektioniere meine Verwaltungsseite": Dogi/VanVan koennen in verwaltung.html eine Frage mit 2-6 Antwortoptionen auf Deutsch erstellen, automatische Uebersetzung beim Speichern (gleiches Muster wie "Event des Jahres"). Jede aktive DogiCrew- Person sieht die Abstimmung in ihrem Supporter-Bereich, stimmt genau einmal ab (UNIQUE-Constraint in der DB, nicht nur Anwendungslogik), sieht danach die Live-Ergebnisse. Admin-Seite zeigt Ergebnisbalken live, kann schliessen/ wiedereroeffnen/loeschen. - Neue Migration 0005_supporter_polls.sql (supporter_polls, supporter_poll_votes), neue Berechtigung POLLS_MANAGE. - server-internal/routes/polls.js: 30 End-to-End-Tests gegen eine Fake-DB bestanden (better-sqlite3 laesst sich lokal nicht kompilieren). - verwaltung.html: neue "Abstimmungen"-Kiste im bestehenden vw-overview-box-Stil (violett/pink Ergebnisbalken). - supporter.html: neue "Aktuelle Abstimmung"-Karte im bestehenden Gold-Look, Optionen -> Stimme -> Ergebnisbalken, alle 5 Sprachen. Backend-Teil (server-internal/, cloudflare-worker/migrations/) noch ohne Deploy-Zugriff -- Dogi muss ihn manuell auf dogiintern ausrollen. Co-Authored-By: Claude Opus 5 <[email protected]>
79 lines
3.9 KiB
JavaScript
79 lines
3.9 KiB
JavaScript
/* =====================================================================
|
|
permissions.js — Vollständiger Permission-Katalog. 1:1 portiert aus
|
|
cloudflare-worker/src/lib/permissions.js (keine Datenbank-Abhängigkeit).
|
|
===================================================================== */
|
|
|
|
export const PERMISSIONS = {
|
|
APPLICATIONS_VIEW_CREATOR: "Creator-Bewerbungen ansehen",
|
|
APPLICATIONS_VIEW_MANAGER_SCOUT: "Manager-/Scout-Bewerbungen ansehen",
|
|
APPLICATIONS_VIEW_ARCHIVED: "Archivierte Bewerbungen ansehen",
|
|
APPLICATIONS_OPEN_FULL: "Vollständige Bewerbungen öffnen",
|
|
|
|
APPLICATIONS_TAKE_OVER: "Bewerbungen übernehmen",
|
|
APPLICATIONS_ASSIGN: "Bewerbungen anderen Personen zuweisen",
|
|
APPLICATIONS_CHANGE_STATUS: "Status verändern",
|
|
APPLICATIONS_ARCHIVE: "Bewerbungen archivieren",
|
|
APPLICATIONS_RESTORE: "Bewerbungen wiederherstellen",
|
|
APPLICATIONS_DELETE: "Bewerbungen löschen",
|
|
|
|
DRAFTS_CREATE: "Antwortentwürfe erstellen",
|
|
DRAFTS_EDIT_OWN: "Eigene Entwürfe bearbeiten",
|
|
DRAFTS_EDIT_OTHERS: "Entwürfe anderer Personen bearbeiten",
|
|
REPLIES_COPY: "Fertige Antworten kopieren",
|
|
EMAILS_COPY: "E-Mail-Adressen kopieren",
|
|
APPLICATIONS_MARK_ANSWERED: "Bewerbungen als beantwortet markieren",
|
|
|
|
NOTES_READ: "Notizen lesen",
|
|
NOTES_WRITE: "Notizen schreiben",
|
|
NOTES_EDIT_OWN: "Eigene Notizen bearbeiten",
|
|
NOTES_EDIT_OTHERS: "Fremde Notizen bearbeiten",
|
|
NOTES_DELETE: "Notizen löschen",
|
|
|
|
TEAM_VIEW: "Andere Teammitglieder ansehen",
|
|
TEAM_PREPARE_USER: "Neue Benutzer vorbereiten",
|
|
TEAM_LOCK_USER: "Benutzer sperren",
|
|
TEAM_ASSIGN_ROLE: "Rollen vergeben",
|
|
TEAM_CREATE_ROLE: "Rollen erstellen",
|
|
TEAM_EDIT_PERMISSIONS: "Allgemeine Berechtigungen verändern",
|
|
|
|
SETTINGS_EDIT_FORMS: "Bewerbungsformulare bearbeiten",
|
|
SETTINGS_EDIT_STATUS_TYPES: "Statusarten verändern",
|
|
SETTINGS_VIEW_STATS: "Statistiken ansehen",
|
|
SETTINGS_VIEW_ACTIVITY_LOG: "Aktivitätsverlauf ansehen",
|
|
SETTINGS_EDIT_GENERAL: "Allgemeine Einstellungen bearbeiten",
|
|
|
|
SUPPORTER_VIEW: "Supporter-Abonnenten ansehen",
|
|
SUPPORTER_MANAGE_PREMIUMS: "Supporter-Prämien & Versand verwalten",
|
|
SUPPORTER_MANAGE_COLLECTIONS: "Supporter-Kollektionen verwalten",
|
|
POLLS_MANAGE: "Supporter-Abstimmungen erstellen & auswerten",
|
|
|
|
EVENTS_MANAGE: "Startseite: \"Event des Jahres\" verwalten",
|
|
};
|
|
|
|
export const PERMISSION_GROUPS = [
|
|
{ label: "Bewerbungsbereiche", keys: ["APPLICATIONS_VIEW_CREATOR", "APPLICATIONS_VIEW_MANAGER_SCOUT", "APPLICATIONS_VIEW_ARCHIVED", "APPLICATIONS_OPEN_FULL"] },
|
|
{ label: "Bearbeitung", keys: ["APPLICATIONS_TAKE_OVER", "APPLICATIONS_ASSIGN", "APPLICATIONS_CHANGE_STATUS", "APPLICATIONS_ARCHIVE", "APPLICATIONS_RESTORE", "APPLICATIONS_DELETE"] },
|
|
{ label: "Antworten", keys: ["DRAFTS_CREATE", "DRAFTS_EDIT_OWN", "DRAFTS_EDIT_OTHERS", "REPLIES_COPY", "EMAILS_COPY", "APPLICATIONS_MARK_ANSWERED"] },
|
|
{ label: "Interne Notizen", keys: ["NOTES_READ", "NOTES_WRITE", "NOTES_EDIT_OWN", "NOTES_EDIT_OTHERS", "NOTES_DELETE"] },
|
|
{ label: "Teamverwaltung", keys: ["TEAM_VIEW", "TEAM_PREPARE_USER", "TEAM_LOCK_USER", "TEAM_ASSIGN_ROLE", "TEAM_CREATE_ROLE", "TEAM_EDIT_PERMISSIONS"] },
|
|
{ label: "Einstellungen", keys: ["SETTINGS_EDIT_FORMS", "SETTINGS_EDIT_STATUS_TYPES", "SETTINGS_VIEW_STATS", "SETTINGS_VIEW_ACTIVITY_LOG", "SETTINGS_EDIT_GENERAL"] },
|
|
{ label: "DogiCrew 🩵", keys: ["SUPPORTER_VIEW", "SUPPORTER_MANAGE_PREMIUMS", "SUPPORTER_MANAGE_COLLECTIONS", "POLLS_MANAGE"] },
|
|
{ label: "Startseite", keys: ["EVENTS_MANAGE"] },
|
|
];
|
|
|
|
export const OWNER_ONLY_ACTIONS = [
|
|
"CODE_VIEW", "CODE_COPY", "CODE_CREATE", "CODE_EDIT", "CODE_RESET",
|
|
"EDIT_OWNER_ACCOUNT", "DELETE_OR_LIMIT_OWNER_ROLE", "PROMOTE_TO_OWNER",
|
|
];
|
|
|
|
export function hasPermission(rolePermissions, overrides, key) {
|
|
if (overrides && Object.prototype.hasOwnProperty.call(overrides, key)) {
|
|
return !!overrides[key];
|
|
}
|
|
return Array.isArray(rolePermissions) && rolePermissions.includes(key);
|
|
}
|
|
|
|
export function isValidPermissionKey(key) {
|
|
return Object.prototype.hasOwnProperty.call(PERMISSIONS, key);
|
|
}
|