Files
trainingstagebuch/PERMISSIONS_MIGRATION.md
Torsten Schulz (local) 5357dac9e1
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 54s
chore: update file permissions for multiple files and add migration for club fee rules
- Changed file permissions from 644 to 755 for various files in the mobile-app and mobile-app_legacy_rn_expo directories, ensuring executable permissions where necessary.
- Added a new SQL migration script to the backend to introduce missing columns for club billing and invoice settings in the clubs table, maintaining synchronization with the current Sequelize model.
2026-07-17 11:51:24 +02:00

5.6 KiB
Executable File

Berechtigungssystem - Migrations-Anleitung

Übersicht

Diese Anleitung hilft Ihnen, das neue Berechtigungssystem für bestehende Clubs einzurichten.

Schritt 1: Datenbank-Schema erweitern

Führen Sie zuerst die SQL-Migration aus, um die neuen Spalten hinzuzufügen:

mysql -u username -p database_name < backend/migrations/add_permissions_to_user_club.sql

Dies fügt folgende Spalten zur user_club Tabelle hinzu:

  • role (VARCHAR) - Benutzerrolle (admin, trainer, team_manager, member)
  • permissions (JSON) - Custom Permissions
  • is_owner (BOOLEAN) - Markiert den Club-Ersteller

Schritt 2: Bestehende Daten migrieren

Sie haben zwei Optionen:

Option A: Node.js Script (Empfohlen)

Das Script identifiziert automatisch den ersten Benutzer jedes Clubs (nach createdAt) und setzt ihn als Owner.

cd /home/torsten/Programs/trainingstagebuch/backend
node scripts/migratePermissions.js

Ausgabe:

Starting permissions migration...

Found 3 club(s)

--- Club: TTC Beispiel (ID: 1) ---
  Members found: 5
  First member (will be owner): admin@example.com
  ✓ Updated admin@example.com: role=admin, isOwner=true
  ✓ Updated user1@example.com: role=member, isOwner=false
  ✓ Updated user2@example.com: role=member, isOwner=false
  ...

✅ Migration completed successfully!

Summary:
Club Owners (3):
  - TTC Beispiel: admin@example.com
  - SV Teststadt: owner@test.de
  - TSC Demo: demo@example.com

Role Distribution:
  - Admins: 3
  - Members: 12

Option B: SQL Script

Wenn Sie lieber SQL verwenden möchten:

mysql -u username -p database_name < backend/migrations/update_existing_user_club_permissions.sql

Dieses Script:

  1. Setzt role = 'member' für alle genehmigten Benutzer ohne Rolle
  2. Markiert den Benutzer mit der niedrigsten user_id pro Club als Owner

Schritt 3: Manuelle Anpassungen (Optional)

Falscher Owner?

Falls das Script den falschen Benutzer als Owner markiert hat, können Sie dies manuell korrigieren:

-- Alten Owner zurücksetzen
UPDATE user_club 
SET is_owner = 0, role = 'member' 
WHERE club_id = 1 AND user_id = 123;

-- Neuen Owner setzen
UPDATE user_club 
SET is_owner = 1, role = 'admin' 
WHERE club_id = 1 AND user_id = 456;

Weitere Admins ernennen

UPDATE user_club 
SET role = 'admin' 
WHERE club_id = 1 AND user_id = 789;

Trainer ernennen

UPDATE user_club 
SET role = 'trainer' 
WHERE club_id = 1 AND user_id = 101;

Schritt 4: Verifizierung

Backend neu starten

# Server neu starten (wenn er läuft)
sudo systemctl restart tt-tagebuch

Im Browser testen

  1. Loggen Sie sich ein
  2. Wählen Sie einen Club aus
  3. Navigieren Sie zu "Berechtigungen" (nur für Admins sichtbar)
  4. Überprüfen Sie, dass alle Mitglieder korrekt angezeigt werden

SQL Verifizierung

-- Alle Club-Mitglieder mit ihren Berechtigungen anzeigen
SELECT 
    c.name as club_name,
    u.email as user_email,
    uc.role,
    uc.is_owner,
    uc.approved
FROM user_club uc
JOIN club c ON c.id = uc.club_id
JOIN user u ON u.id = uc.user_id
WHERE uc.approved = 1
ORDER BY c.name, uc.is_owner DESC, uc.role, u.email;

Troubleshooting

Problem: "Keine Berechtigung" trotz Owner-Status

Lösung: Überprüfen Sie in der Datenbank:

SELECT role, is_owner, approved 
FROM user_club 
WHERE user_id = YOUR_USER_ID AND club_id = YOUR_CLUB_ID;

Sollte sein: role='admin', is_owner=1, approved=1

Problem: Owner kann nicht geändert werden

Das ist korrekt! Der Owner (Club-Ersteller) kann seine eigenen Rechte nicht verlieren. Dies ist eine Sicherheitsmaßnahme.

Problem: Berechtigungen werden nicht geladen

Lösung:

  1. Browser-Cache leeren
  2. LocalStorage leeren: localStorage.clear() in der Browser-Console
  3. Neu einloggen

Problem: "Lade Mitglieder..." bleibt hängen

Mögliche Ursachen:

  1. Migration noch nicht ausgeführt
  2. Backend nicht neu gestartet
  3. Frontend nicht neu gebaut

Lösung:

# Backend
cd /home/torsten/Programs/trainingstagebuch/backend
node scripts/migratePermissions.js

# Frontend
cd /home/torsten/Programs/trainingstagebuch/frontend
npm run build

# Server neu starten
sudo systemctl restart tt-tagebuch

Nach der Migration

Neue Clubs

Bei neuen Clubs wird der Ersteller automatisch als Owner mit Admin-Rechten eingerichtet. Keine manuelle Aktion erforderlich.

Neue Mitglieder

Neue Mitglieder erhalten automatisch die Rolle "member" (Lesezugriff). Admins können die Rolle später ändern.

Berechtigungen verwalten

Admins können über die Web-UI unter /permissions Berechtigungen verwalten:

  1. Rollen zuweisen (Admin, Trainer, Mannschaftsführer, Mitglied)
  2. Custom Permissions definieren (für spezielle Anwendungsfälle)

Wichtige Hinweise

⚠️ Sicherung erstellen:

mysqldump -u username -p database_name > backup_before_permissions_$(date +%Y%m%d).sql

⚠️ Owner-Rechte:

  • Der Owner (is_owner=1) kann nicht degradiert oder gelöscht werden
  • Jeder Club hat genau einen Owner
  • Owner-Rechte können nicht übertragen werden (nur durch direkte DB-Änderung)

⚠️ MyTischtennis:

  • MyTischtennis-Funktionen sind für ALLE Mitglieder zugänglich
  • Keine Berechtigungsprüfung für MyTischtennis-Endpunkte

Rollback (falls nötig)

Falls Sie das Berechtigungssystem zurücknehmen müssen:

-- Spalten entfernen (Achtung: Datenverlust!)
ALTER TABLE user_club 
DROP COLUMN role,
DROP COLUMN permissions,
DROP COLUMN is_owner;

-- Indizes entfernen
DROP INDEX idx_user_club_role ON user_club;
DROP INDEX idx_user_club_owner ON user_club;

Dann Backend-Code auf vorherige Version zurücksetzen.