# YachtMemory Permission Foundation 2A

Dieses Paket führt die erste allgemeine globale Permission-Schicht des
YachtMemory-Portals ein.

## Bewusste Abgrenzung

Nicht verändert werden:

- `users.global_role` (`user` / `superadmin`)
- `organization_users.org_role`
- die bestehende Tabelle `roles`
- Organisations- und Schiffsberechtigungen

Die neue Permission-Schicht ist ausschließlich global.

## Neue Tabellen

### permissions

Definiert bekannte Plattform-Berechtigungen.

Erste Permission:

```text
architecture.read
```

### user_permissions

Ordnet einem normalen Benutzer explizite globale Berechtigungen zu.

Foreign Keys verwenden `ON DELETE CASCADE`.

## Superadmin

`superadmin` erhält globalen Vollzugriff implizit über `current_user_can()`.
Dafür werden keine redundanten Datensätze in `user_permissions` benötigt.

## Neue Auth-Funktionen

```php
current_user_can('architecture.read');
require_permission('architecture.read');
```

## Benutzerverwaltung

`admin_user_create.php` und `admin_user_edit.php` erhalten den Abschnitt:

```text
Globale Berechtigungen
[ ] Architektur-Dokumentation lesen
    architecture.read
```

Bei Superadmins ist keine explizite Auswahl erforderlich.

## Transaktionen

Benutzeranlage und Profiländerung werden nun zusammen mit

- Organisationszuordnungen und
- globalen Permissions

jeweils in einer gemeinsamen Datenbanktransaktion gespeichert.

Die bestehende Methode `replaceOrganizationMemberships()` bleibt weiterhin
einzeln nutzbar und erkennt, ob sie innerhalb einer bereits laufenden
Transaktion aufgerufen wird.

## Installation

```bash
cd /var/www/app.yachtmemory.net

unzip yachtmemory_permission_foundation_2A.zip
cd yachtmemory_permission_foundation_2A

sudo ./install.sh /var/www/app.yachtmemory.net yachtmemory_app admin
```

Das Skript fragt interaktiv nach dem MySQL-Passwort des Benutzers `admin`.

Vor dem Ersetzen der PHP-Dateien wird automatisch ein Backup angelegt.

## Browser-Abnahme

1. Als Superadmin `/admin_user_create.php` öffnen.
2. Abschnitt `Globale Berechtigungen` muss sichtbar sein.
3. Normalen Testbenutzer mit `architecture.read` anlegen oder vorhandenen
   normalen Benutzer bearbeiten.
4. Seite erneut öffnen: Checkbox muss gespeichert sein.
5. Permission wieder entfernen und speichern: Checkbox muss danach leer sein.
6. Einen Superadmin bearbeiten: Hinweis auf impliziten Vollzugriff erscheint;
   Checkbox ist nicht erforderlich.

## SQL-Kontrolle

```sql
SELECT
    u.username,
    u.global_role,
    p.permission_key
FROM users u
LEFT JOIN user_permissions up
  ON up.user_id = u.id
LEFT JOIN permissions p
  ON p.id = up.permission_id
ORDER BY u.username, p.permission_key;
```

Für Superadmins darf `permission_key` NULL sein; sie besitzen die Permission
trotzdem implizit.

## Noch nicht Bestandteil dieses Pakets

- ADR-Bibliotheksseite
- PDF-Downloadroute
- Navigationseintrag `Architektur`

Diese folgen in Paket 2B.
