# 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 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 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= # 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]