Files
immorechner/README.md
2025-11-08 22:19:33 +01:00

539 lines
14 KiB
Markdown

# Immorechner
Eine moderne Webanwendung zur Immobilienberechnung, entwickelt mit Symfony 7.3, PHP 8.4 und MariaDB.
## Features
- **REST-API**: Vollständige REST-API mit API Platform 4.2
- **Swagger/OpenAPI**: Automatische interaktive API-Dokumentation (Swagger UI)
- **Web-Interface**: Benutzerfreundliche Weboberfläche mit Twig-Templates
- **Immobilien-Management**: Vollständige CRUD-Operationen für Immobilien mit automatischen Berechnungen
- **User Management**: Benutzerverwaltung mit Rollenbasierter Zugriffskontrolle (USER, ADMIN, MODERATOR)
- **Docker-Setup**: Vollständig containerisierte Entwicklungsumgebung
- **Datenbank-Migrationen**: Versionskontrollierte Datenbankschema-Verwaltung mit Doctrine
- **CORS-Unterstützung**: Konfigurierbare CORS-Einstellungen für API-Zugriffe
- **phpMyAdmin**: Integriertes Datenbank-Verwaltungstool
## Technologie-Stack
- **Backend**: PHP 8.4
- **Framework**: Symfony 7.3
- **Datenbank**: MariaDB (Latest)
- **ORM**: Doctrine 3.0
- **API**: API Platform 4.2
- **Template Engine**: Twig 3.22
- **Webserver**: Apache 2.4 mit mod_rewrite
- **Container**: Docker & Docker Compose
- **Datenbank-Tool**: phpMyAdmin
## Voraussetzungen
- Docker Desktop (Windows/Mac) oder Docker Engine + Docker Compose (Linux)
- Git
## Installation
### 1. Repository klonen
```bash
git clone <repository-url>
cd immorechner
```
### 2. Docker-Container starten
```bash
docker-compose up -d --build
```
Dieser Befehl:
- Baut das PHP 8.4 Image mit allen benötigten Extensions
- Startet MariaDB
- Startet phpMyAdmin
- Startet den Apache-Webserver
### 3. Dependencies installieren
```bash
docker-compose exec web composer install
```
### 4. Bundle-Assets installieren
```bash
docker-compose exec web php bin/console assets:install public --symlink --relative
```
Dieser Schritt ist wichtig für die Swagger UI (CSS, JS, Bilder).
### 5. Datenbank-Schema erstellen
```bash
docker-compose exec web php bin/console doctrine:migrations:migrate --no-interaction
```
### 6. Cache leeren
```bash
docker-compose exec web php bin/console cache:clear
```
## Verwendung
### Anwendung aufrufen
- **Web-Interface**: http://localhost:8080
- **API-Dokumentation (Swagger UI)**: http://localhost:8080/api/docs.html
- **API Entrypoint (Hydra)**: http://localhost:8080/api
- **OpenAPI Spezifikation (JSON)**: http://localhost:8080/api/docs?format=json
- **phpMyAdmin**: http://localhost:8081
- Server: `db`
- Benutzer: `root`
- Passwort: `root`
### Schnellstart API
Die vollständige API-Dokumentation mit allen Endpunkten, Beispielen und interaktiven Tests finden Sie im Abschnitt **[API-Dokumentation](#api-dokumentation)** weiter unten.
Wichtigste Endpunkte:
- **Immobilien**: `/api/immobilies` (GET, POST, PATCH, DELETE)
- **Benutzer**: `/api/users` (GET, POST, PUT, DELETE)
## Datenbank-Schema
### User-Tabelle
| Feld | Typ | Beschreibung |
|------|-----|--------------|
| id | INT | Primärschlüssel (Auto-Increment) |
| name | VARCHAR(255) | Benutzername (min. 2 Zeichen) |
| email | VARCHAR(255) | E-Mail-Adresse (Unique) |
| role | ENUM | Benutzerrolle (user, admin, moderator) |
| created_at | DATETIME | Erstellungsdatum |
### Immobilien-Tabelle
| Feld | Typ | Beschreibung |
|------|-----|--------------|
| id | INT | Primärschlüssel (Auto-Increment) |
| verwalter_id | INT | Foreign Key zu User (Verwalter der Immobilie) |
| adresse | VARCHAR(255) | Vollständige Adresse (5-255 Zeichen) |
| preis | DECIMAL | Kaufpreis oder Miete |
| flaeche | DECIMAL | Wohnfläche in m² |
| garage | BOOLEAN | Hat Garage? (Standard: false) |
| zimmer | INT | Anzahl Zimmer (> 0) |
| baujahr | INT | Baujahr (1800-2100, optional) |
| typ | ENUM | Immobilientyp (wohnung, haus, grundstueck, gewerbe, buero) |
| beschreibung | TEXT | Freitextbeschreibung (optional) |
| verfuegbar | BOOLEAN | Verfügbarkeit (Standard: true) |
| balkon_flaeche | INT | Balkonfläche in m² (optional) |
| keller_flaeche | INT | Kellerfläche in m² (optional) |
| etage | INT | Stockwerk (optional) |
| heizungstyp | VARCHAR(255) | Art der Heizung (optional) |
| nebenkosten | DECIMAL | Monatliche Nebenkosten (optional) |
| created_at | DATETIME | Erstellungsdatum |
| updated_at | DATETIME | Letzte Aktualisierung |
**Berechnete Felder (nicht in DB gespeichert):**
- `preis_pro_qm`: Preis / Fläche
- `gesamtflaeche`: Fläche + Balkon + Keller
## Entwicklung
### Neue Entity erstellen
```bash
docker-compose exec web php bin/console make:entity
```
### Migration erstellen
```bash
docker-compose exec web php bin/console doctrine:migrations:diff
```
### Migration ausführen
```bash
docker-compose exec web php bin/console doctrine:migrations:migrate
```
### Controller erstellen
```bash
docker-compose exec web php bin/console make:controller
```
### Cache leeren
```bash
docker-compose exec web php bin/console cache:clear
```
### Symfony Console aufrufen
```bash
docker-compose exec web php bin/console
```
## Docker-Befehle
### Container starten
```bash
docker-compose up -d
```
### Container stoppen
```bash
docker-compose down
```
### Container neu bauen
```bash
docker-compose up -d --build
```
### Container-Logs anzeigen
```bash
# Alle Container
docker-compose logs -f
# Nur Web-Container
docker-compose logs -f web
# Nur Datenbank-Container
docker-compose logs -f db
```
### In Container einloggen
```bash
# Web-Container (PHP/Apache)
docker-compose exec web bash
# Datenbank-Container
docker-compose exec db bash
```
### Composer-Befehle ausführen
```bash
docker-compose exec web composer require <paket-name>
docker-compose exec web composer update
docker-compose exec web composer dump-autoload
```
## Projekt-Struktur
```
immorechner/
├── bin/ # Symfony Console und andere Binaries
├── config/ # Symfony Konfigurationsdateien
├── docker/ # Docker-Konfigurationsdateien
│ └── apache/ # Apache VirtualHost Konfiguration
├── migrations/ # Doctrine Datenbank-Migrationen
├── public/ # Web-Root (index.php, Assets)
├── src/ # PHP-Quellcode
│ ├── Controller/ # Controller
│ ├── Entity/ # Doctrine Entities
│ ├── Enum/ # PHP Enums
│ ├── Repository/ # Doctrine Repositories
│ └── Kernel.php # Symfony Kernel
├── templates/ # Twig-Templates
│ ├── base.html.twig # Basis-Template
│ └── home/ # Homepage-Templates
├── var/ # Cache, Logs
├── vendor/ # Composer Dependencies
├── .env # Umgebungsvariablen
├── .env.example # Beispiel-Umgebungsvariablen
├── .gitignore # Git Ignore-Datei
├── composer.json # Composer-Konfiguration
├── docker-compose.yml # Docker Compose-Konfiguration
├── Dockerfile # Docker-Image für PHP/Apache
└── README.md # Diese Datei
```
## Umgebungsvariablen
Die Anwendung verwendet folgende Umgebungsvariablen (definiert in `.env`):
```env
# Symfony
APP_ENV=dev
APP_SECRET=<generierter-secret-key>
# Datenbank
DATABASE_URL="mysql://immorechner_user:immorechner_pass@db:3306/immorechner?serverVersion=mariadb-11.7.1&charset=utf8mb4"
# CORS
CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$'
# Routing
DEFAULT_URI=http://localhost
```
## Konfiguration
### CORS anpassen
CORS-Einstellungen können in `config/packages/nelmio_cors.yaml` angepasst werden.
### Datenbank-Verbindung ändern
Datenbank-Verbindung in `.env` anpassen:
```env
DATABASE_URL="mysql://user:password@host:port/database?serverVersion=mariadb-11.7.1"
```
### Apache-Konfiguration
Apache-VirtualHost-Konfiguration befindet sich in `docker/apache/000-default.conf`.
## Fehlerbehebung
### Swagger UI lädt ohne CSS/JS (Assets fehlen)
Wenn die Swagger UI unter http://localhost:8080/api/docs.html zwar lädt, aber keine Styles/Formatierung hat:
```bash
# Bundle-Assets installieren
docker-compose exec web php bin/console assets:install public --symlink --relative
# Cache leeren
docker-compose exec web php bin/console cache:clear
```
Danach sollten alle CSS-, JS- und Bilddateien unter `/bundles/apiplatform/` verfügbar sein.
### Container starten nicht
```bash
# Container-Logs prüfen
docker-compose logs
# Container-Status prüfen
docker ps -a
# Container neu bauen
docker-compose down
docker-compose up -d --build
```
### "Class not found" Fehler
```bash
# Autoloader neu generieren
docker-compose exec web composer dump-autoload
# Cache leeren
docker-compose exec web php bin/console cache:clear
# Container neu starten
docker-compose restart web
```
### Datenbank-Verbindungsfehler
```bash
# Prüfen ob DB-Container läuft
docker ps | grep db
# DB-Logs prüfen
docker-compose logs db
# In DB-Container einloggen und testen
docker-compose exec db mysql -u root -proot
```
### Port bereits belegt
Wenn Port 8080, 8081 oder 3306 bereits belegt ist, können die Ports in `docker-compose.yml` angepasst werden:
```yaml
services:
web:
ports:
- "8090:80" # Statt 8080:80
```
## API-Dokumentation
Die Anwendung nutzt **API Platform** zur automatischen Generierung von OpenAPI/Swagger-Dokumentation. Die interaktive Dokumentation ermöglicht es, alle API-Endpunkte direkt im Browser zu testen.
### Swagger UI (Interaktive Dokumentation)
Die **Swagger UI** bietet eine vollständige, interaktive Dokumentation aller API-Endpunkte:
**URL**: http://localhost:8080/api/docs.html
Features:
- Übersicht aller verfügbaren Endpunkte
- Interaktives Testen direkt im Browser
- Detaillierte Request/Response-Schemas
- Automatische Validierung von Parametern
- Try-it-out Funktion für alle Operationen
### OpenAPI Spezifikation
Die OpenAPI-Spezifikation (ehemals Swagger) kann in verschiedenen Formaten abgerufen werden:
#### OpenAPI JSON-Format
```bash
curl "http://localhost:8080/api/docs?format=json"
```
#### JSON-LD Format (Hydra)
```bash
curl http://localhost:8080/api/docs.jsonld
```
#### HTML Format (Swagger UI)
```bash
curl http://localhost:8080/api/docs.html
# oder im Browser öffnen: http://localhost:8080/api/docs.html
```
### API-Formate
Die API unterstützt mehrere Content-Type-Formate:
| Format | Content-Type | Beschreibung |
|--------|--------------|--------------|
| **JSON-LD** | `application/ld+json` | Standard-Format mit Linked Data Kontext (Hydra) |
| **JSON** | `application/json` | Einfaches JSON-Format |
| **HTML** | `text/html` | HTML-Darstellung (Swagger UI) |
#### Beispiel: JSON-Format verwenden
```bash
curl -H "Accept: application/json" http://localhost:8080/api/users
```
#### Beispiel: JSON-LD Format (Standard)
```bash
curl http://localhost:8080/api/users
# oder explizit:
curl -H "Accept: application/ld+json" http://localhost:8080/api/users
```
### Verfügbare Ressourcen
#### Immobilien-Endpunkte
| Methode | Endpoint | Beschreibung |
|---------|----------|--------------|
| GET | `/api/immobilies` | Alle Immobilien abrufen (mit Pagination) |
| GET | `/api/immobilies/{id}` | Einzelne Immobilie abrufen |
| POST | `/api/immobilies` | Neue Immobilie erstellen |
| PATCH | `/api/immobilies/{id}` | Immobilie teilweise aktualisieren |
| DELETE | `/api/immobilies/{id}` | Immobilie löschen |
#### User-Endpunkte
| Methode | Endpoint | Beschreibung |
|---------|----------|--------------|
| GET | `/api/users` | Alle User abrufen (mit Pagination) |
| GET | `/api/users/{id}` | Einzelnen User abrufen |
| POST | `/api/users` | Neuen User erstellen |
| PUT | `/api/users/{id}` | User vollständig ersetzen |
| DELETE | `/api/users/{id}` | User löschen |
### Beispiele
#### Immobilie erstellen
```bash
curl -X POST http://localhost:8080/api/immobilies \
-H "Content-Type: application/json" \
-d '{
"verwalter": "/api/users/1",
"adresse": "Hauptstraße 123, 12345 Musterstadt",
"preis": "250000",
"flaeche": "85.5",
"zimmer": 3,
"typ": "wohnung",
"garage": true,
"balkonFlaeche": 8,
"baujahr": 2020
}'
```
#### User erstellen
```bash
curl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{
"name": "Max Mustermann",
"email": "max@example.com",
"role": "user"
}'
```
#### Immobilien mit Filter abrufen (Pagination)
```bash
# Erste Seite (Standard)
curl http://localhost:8080/api/immobilies
# Zweite Seite
curl http://localhost:8080/api/immobilies?page=2
```
#### Einzelne Immobilie aktualisieren (PATCH)
```bash
curl -X PATCH http://localhost:8080/api/immobilies/1 \
-H "Content-Type: application/merge-patch+json" \
-d '{
"preis": "260000",
"verfuegbar": false
}'
```
### Berechnete Felder
Die Immobilien-Entity bietet automatisch berechnete Felder:
- **preisProQm**: Berechnet automatisch den Preis pro Quadratmeter
- **gesamtflaeche**: Summiert Wohnfläche + Balkonfläche + Kellerfläche
Diese Felder sind schreibgeschützt (read-only) und werden automatisch bei jeder Abfrage berechnet.
### Hydra-Unterstützung
Bei Verwendung des JSON-LD Formats (Standard) bietet die API Hydra-Unterstützung:
- **@context**: Beschreibt die Linked Data Struktur
- **@id**: IRI (Internationalized Resource Identifier) der Ressource
- **@type**: Typ der Ressource
- **hydra:member**: Array der Ressourcen in Collections
- **hydra:totalItems**: Gesamtanzahl der Elemente
- **hydra:view**: Pagination-Links (first, last, next, previous)
## Sicherheitshinweise
**Wichtig für Produktion:**
1. Ändern Sie alle Standardpasswörter in `docker-compose.yml` und `.env`
2. Generieren Sie einen neuen `APP_SECRET` für `.env`
3. Setzen Sie `APP_ENV=prod` in der Produktion
4. Konfigurieren Sie CORS entsprechend Ihrer Domain
5. Aktivieren Sie HTTPS
6. Verwenden Sie sichere Datenbank-Credentials
7. Entfernen Sie phpMyAdmin aus der Produktion
## Lizenz
[Lizenz hier einfügen]
## Kontakt
[Kontaktinformationen hier einfügen]