From 8ffd267dfcd373ef69287c1aac46126f23563b69 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 30 Mar 2026 15:41:16 +0200 Subject: [PATCH] Enhance member management UI by adding hall key status display and editing capabilities. Update API to support hall key data integration in member records. --- scripts/add-vorstand-role.js | 81 ++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 scripts/add-vorstand-role.js diff --git a/scripts/add-vorstand-role.js b/scripts/add-vorstand-role.js new file mode 100644 index 0000000..f3d5696 --- /dev/null +++ b/scripts/add-vorstand-role.js @@ -0,0 +1,81 @@ +#!/usr/bin/env node +/** + * Gibt einem bestehenden Benutzer zusaetzlich die Rolle "vorstand". + * + * Verwendung: + * node scripts/add-vorstand-role.js + * node scripts/add-vorstand-role.js + * + * Standard-E-Mail: + * tsschulz@gmx.net + */ + +import fs from 'fs/promises' +import path from 'path' +import { fileURLToPath } from 'url' +import dotenv from 'dotenv' +import { readUsers, writeUsers, migrateUserRoles } from '../server/utils/auth.js' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +dotenv.config({ path: path.join(__dirname, '..', '.env') }) + +const targetEmail = String(process.argv[2] || 'tsschulz@gmx.net').trim().toLowerCase() + +function getDataPath(filename) { + const cwd = process.cwd() + if (cwd.endsWith('.output')) { + return path.join(cwd, '../server/data', filename) + } + return path.join(cwd, 'server/data', filename) +} + +async function createBackup(filePath) { + const backupDir = path.join(__dirname, '..', 'backups', `users-${Date.now()}`) + await fs.mkdir(backupDir, { recursive: true }) + const backupPath = path.join(backupDir, 'users.json') + await fs.copyFile(filePath, backupPath) + return backupPath +} + +async function main() { + const usersFile = getDataPath('users.json') + + console.log(`Suche Benutzer: ${targetEmail}`) + + const users = await readUsers() + const user = users.find((entry) => String(entry.email || '').trim().toLowerCase() === targetEmail) + + if (!user) { + console.error(`Benutzer nicht gefunden: ${targetEmail}`) + process.exit(1) + } + + migrateUserRoles(user) + const currentRoles = Array.isArray(user.roles) ? [...user.roles] : [] + + if (currentRoles.includes('vorstand')) { + console.log(`Benutzer ${targetEmail} hat die Rolle "vorstand" bereits.`) + console.log(`Aktuelle Rollen: ${currentRoles.join(', ')}`) + return + } + + const backupPath = await createBackup(usersFile) + user.roles = [...new Set([...currentRoles, 'vorstand'])] + + const success = await writeUsers(users) + if (!success) { + console.error('Fehler beim Schreiben der Benutzerdaten.') + process.exit(1) + } + + console.log(`Backup erstellt: ${backupPath}`) + console.log(`Rolle "vorstand" hinzugefuegt fuer ${targetEmail}`) + console.log(`Aktuelle Rollen: ${user.roles.join(', ')}`) +} + +main().catch((error) => { + console.error('Fehler beim Hinzufuegen der Rolle "vorstand":', error) + process.exit(1) +})