# Übersicht der Inhalt

### Fett markierte Verzeichnisse und deren Inhalt sind von besonderem Interesse

- **api**
  - docs
    - API Dokumentation (openAPI 3.0)
  - Login
    - `/api/login` Endpunkt Klasse `Login.php`
  - Logout
    - `/api/login` Endpunkt Klasse `Logout.php`
  - Posts
    - `/api/posts` Endpunkt Klasse `Posts.php`
    - `/api/posts/{id}` Endpunkt Klasse `Posts.php`
  - Refresh
    - `/api/refresh` Endpunkt Klasse `Refresh.php`
  - Register
    - `/api/register` Endpunkt Klasse `Register.php`
  - Users
    - `/users` Endpunkt Klasse `Users.php`
    - `/users/{id}` Endpunkt Klasse `Users.php`
    - Image
      - `/users{id}/image` Endpunkt Klasse `Image.php`
    - Posts
      - `/users{id}/posts` Endpunkt Klasse `Posts.php`
  - `index.php`
    - API Einstiegspunkt
- **classes**
  - Api
    - `Api.php`: Basisklasse für Endpunkte
  - ApiError
    - `ApiError.php`: Facade für Fehler die das Api zurück gibt
  - Auth
    - `AdminAuth.php`: Middleware für Authentifizierung zuzüglich Admin Rechte
    - `Auth.php`: Middleware für Authentifizierung
    - `OptAuth.php`: Middleware für optionale Authentifizierung
  - Config
    - `Config.php`: Singleton für Applikationskonfiguration
  - Database
    - `Database.php`: Singleton für Datenbankzugriffe (Wrapper um PDO)
  - GUID
    - `GUID.php`: Facade für GUID Algorithmen
  - Input
    - `Input.php`: Facade die SimpleRouters `Input` Klasse wrapped für 
                   einfacheren Zugriff auf häufig verwendete Methoden
  - Models
    - Post
      - `Post.php`: Modellklasse für Posts. Abstrahiert und kapselt
                    Datenbankzugriffe
    - User
      - `User.php`: Modellklasse für User. Abstrahiert und kapselt
                    Datenbankzugriffe
  - Request
    - `Request.php`: Facade die SimpleRouters `Request` Klasse wrapped für 
                     einfacheren Zugriff auf häufig verwendete Methoden
  - Response
    - `Response.php`: Facade die SimpleRouters `Response` Klasse wrapped für 
                      einfacheren Zugriff auf häufig verwendete Methoden
- **config**
  - `app.php`: Applikationskonfiguration
  - `database.php`: Datenbankverbindungsdaten
- dist
  - React Buildartefakte.
- react
  - React Projekt
- **routes**
  - `routes.php`: SimpleRouter Routenkonfiguration für die Applikation
- storage:
  - Speicherort für Profilbilder
- **utils**:
  - `helpers.php`: Kleine Helferlein
- vendor:
  - Verzeichnis für Composer Pakete

# Autoloader

Verwendet wird hier der Composer Autoloader. Konfiguriert werden dessen
Namespaces in der `composer.json`. Durch `composer dump-autoload` wird
der Autoloader aktualisiert sollten neue Namespaces hinzugefügt werden.

# Voraussetzungen um das React Projekt zu bauen
- Node 18
- PNPM

# Veränderungen Datenbank

## Tabelle `egb_benutzer`
- Neue Spalten `token` (Auth token): VarChar(36), Nullable, UNIQUE Constraint
- Neue Spalten `tokenExpiry` (Auth token verfall): DateTime, Nullable
- Neue Spalten `refreshToken` (Auth refresh token): VarChar(36), Nullable, UNIQUE Constraint
- Neue Spalten `refreshExpiry` (Auth refresh token verfall): VarChar(36), DateTime
- Abänderung der Spalte `zeitstempel`: Entfernen des `ON UPDATE` (da sonst die Mitgliedszeit beim Ändern der Daten sich ändert)
- Abänderung der Spalte `benutzername`: Non-Nullable gemacht, UNIQUE Constraint
- Abänderung der Spalte `email`: Non-Nullable gemacht, UNIQUE Constraint
- Abänderung der Spalte `passwort`: Non-Nullable gemacht
- Abänderung der Spalte `confirmationcode`: Default auf `NULL` gesetzt

## Tabelle `egb_gaestebuch`
- Abänderung der Spalte `benutzer_id`: Non-Nullable gemacht
- Abänderung der Spalte `beitrag`: Non-Nullable gemacht
- Hinzufüge eines Foreign Key Constraints auf `benutzer_id` mit CASCADE (Löschen des Users löscht Beiträge)

# Notwendige Anpassung für die Verzeichnisstruktur eines anderen Hosters

## HTACCESS

### `.htaccess`
- RewriteBase anpassen

### `react/public/.htaccess`
- RewriteBase anpassen
- **WICHTIG:** React Projekt neu bauen damit die Datei an den korrekten Platz kopiert wird

## PHP

### `classes/Models/User.php`
- Link in der Confirmation E-Mail
  
### `config/app.php`
- Alle Pfade

## JS
**WICHTIG:** Nach allen Änderungen muss das React Projekt neu gebaut werden

### `react/vite.config.ts`
- `base` Pfad
  
### `react/src/i18n.ts`
- `loadPath` Pfad

### `react/src/main.tsx`
- `createRouter.basepath` Pfad

### `react/src/api/Api.ts`
- `BASE` API Url

### Projekt bauen
```
cd react
pnpm install
pnpm build
```