diff --git a/Dockerfile b/Dockerfile index a5d3d50..7d32fa5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,46 +1,57 @@ +# Production-ready Symfony Dockerfile FROM php:8.4-apache # Install system dependencies -RUN apt-get update && apt-get install -y \ - git \ - curl \ +RUN apt-get update && apt-get install -y --no-install-recommends \ libpng-dev \ libonig-dev \ libxml2-dev \ libicu-dev \ - zip \ - unzip \ libzip-dev \ - && apt-get clean && rm -rf /var/lib/apt/lists/* + git \ + curl \ + unzip \ + && rm -rf /var/lib/apt/lists/* -# Install PHP extensions for Symfony +# Install PHP extensions needed by Symfony RUN docker-php-ext-configure intl \ - && docker-php-ext-install pdo_mysql mysqli mbstring exif pcntl bcmath gd zip intl opcache + && docker-php-ext-install -j$(nproc) \ + pdo_mysql \ + mbstring \ + exif \ + pcntl \ + bcmath \ + gd \ + zip \ + intl \ + opcache -# Configure opcache for Symfony -RUN echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini \ - && echo "opcache.memory_consumption=256" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini \ - && echo "opcache.max_accelerated_files=20000" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini \ - && echo "opcache.validate_timestamps=0" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini +# Enable Apache modules +RUN a2enmod rewrite headers -# Enable Apache mod_rewrite -RUN a2enmod rewrite - -# Enable Apache headers module -RUN a2enmod headers - -# Copy custom Apache configuration +# Copy Apache configuration COPY ./docker/apache/000-default.conf /etc/apache2/sites-available/000-default.conf -# Install Composer -COPY --from=composer:latest /usr/bin/composer /usr/bin/composer +# Copy Composer from official image +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer # Set working directory WORKDIR /var/www/html -# Change ownership +# Copy Symfony app +COPY . /var/www/html + +# Optimize permissions RUN chown -R www-data:www-data /var/www/html +# Configure opcache for production +RUN { \ + echo "opcache.enable=1"; \ + echo "opcache.memory_consumption=256"; \ + echo "opcache.max_accelerated_files=20000"; \ + echo "opcache.validate_timestamps=0"; \ +} > /usr/local/etc/php/conf.d/opcache.ini + # Expose port 80 EXPOSE 80 diff --git a/config/packages/api_platform.yaml b/config/packages/api_platform.yaml index 2913a99..08d7c3e 100644 --- a/config/packages/api_platform.yaml +++ b/config/packages/api_platform.yaml @@ -28,7 +28,6 @@ api_platform: formats: jsonld: ['application/ld+json'] json: ['application/json'] - html: ['text/html'] docs_formats: jsonld: ['application/ld+json'] jsonopenapi: ['application/vnd.openapi+json'] diff --git a/migrations/Version20251108171050.php b/migrations/Version20251108171050.php deleted file mode 100644 index 783a3f8..0000000 --- a/migrations/Version20251108171050.php +++ /dev/null @@ -1,31 +0,0 @@ -addSql('CREATE TABLE users (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, role VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL, UNIQUE INDEX UNIQ_1483A5E9E7927C74 (email), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('DROP TABLE users'); - } -} diff --git a/migrations/Version20251108172941.php b/migrations/Version20251108172941.php deleted file mode 100644 index e31d82a..0000000 --- a/migrations/Version20251108172941.php +++ /dev/null @@ -1,31 +0,0 @@ -addSql('CREATE TABLE immobilien (id INT AUTO_INCREMENT NOT NULL, adresse VARCHAR(255) NOT NULL, preis NUMERIC(10, 2) NOT NULL, flaeche NUMERIC(8, 2) NOT NULL, garage TINYINT(1) NOT NULL, zimmer INT NOT NULL, baujahr INT DEFAULT NULL, typ VARCHAR(255) NOT NULL, beschreibung LONGTEXT DEFAULT NULL, verfuegbar TINYINT(1) NOT NULL, balkon_flaeche INT DEFAULT NULL, keller_flaeche INT DEFAULT NULL, etage INT DEFAULT NULL, heizungstyp VARCHAR(100) DEFAULT NULL, nebenkosten NUMERIC(6, 2) DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('DROP TABLE immobilien'); - } -} diff --git a/migrations/Version20251108175151.php b/migrations/Version20251108175151.php deleted file mode 100644 index c73fa09..0000000 --- a/migrations/Version20251108175151.php +++ /dev/null @@ -1,42 +0,0 @@ -addSql('ALTER TABLE immobilien ADD verwalter_id INT DEFAULT NULL'); - - // Assign all existing immobilien to the first user - $this->addSql('UPDATE immobilien SET verwalter_id = (SELECT id FROM users ORDER BY id LIMIT 1)'); - - // Now make it NOT NULL and add constraints - $this->addSql('ALTER TABLE immobilien MODIFY verwalter_id INT NOT NULL'); - $this->addSql('ALTER TABLE immobilien ADD CONSTRAINT FK_2C789D3E5F66D3 FOREIGN KEY (verwalter_id) REFERENCES users (id)'); - $this->addSql('CREATE INDEX IDX_2C789D3E5F66D3 ON immobilien (verwalter_id)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE immobilien DROP FOREIGN KEY FK_2C789D3E5F66D3'); - $this->addSql('DROP INDEX IDX_2C789D3E5F66D3 ON immobilien'); - $this->addSql('ALTER TABLE immobilien DROP verwalter_id'); - } -} diff --git a/migrations/Version20251108213222.php b/migrations/Version20251108213222.php deleted file mode 100644 index 83f89ff..0000000 --- a/migrations/Version20251108213222.php +++ /dev/null @@ -1,31 +0,0 @@ -addSql('ALTER TABLE immobilien ADD abschreibungszeit INT DEFAULT NULL, ADD bundesland VARCHAR(255) DEFAULT NULL, ADD kaufpreis INT DEFAULT NULL, DROP balkon_flaeche, DROP keller_flaeche, CHANGE preis preis INT NOT NULL, CHANGE heizungstyp heizungstyp VARCHAR(255) DEFAULT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE immobilien ADD balkon_flaeche INT DEFAULT NULL, ADD keller_flaeche INT DEFAULT NULL, DROP abschreibungszeit, DROP bundesland, DROP kaufpreis, CHANGE preis preis NUMERIC(10, 2) NOT NULL, CHANGE heizungstyp heizungstyp VARCHAR(100) DEFAULT NULL'); - } -} diff --git a/migrations/Version20251108214500.php b/migrations/Version20251108214500.php deleted file mode 100644 index c89d8a1..0000000 --- a/migrations/Version20251108214500.php +++ /dev/null @@ -1,43 +0,0 @@ -addSql('CREATE TABLE bundeslaender (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(100) NOT NULL, grunderwerbsteuer NUMERIC(4, 2) NOT NULL, UNIQUE INDEX UNIQ_DF7DFAB25E237E06 (name), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE heizungstypen (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(100) NOT NULL, UNIQUE INDEX UNIQ_6161C2A65E237E06 (name), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('ALTER TABLE immobilien ADD nutzflaeche INT NOT NULL, ADD heizungstyp_id INT DEFAULT NULL, ADD bundesland_id INT DEFAULT NULL, DROP flaeche, DROP verfuegbar, DROP heizungstyp, DROP nebenkosten, DROP bundesland, CHANGE preis wohnflaeche INT NOT NULL'); - $this->addSql('ALTER TABLE immobilien ADD CONSTRAINT FK_2C789DC1B4DB52 FOREIGN KEY (heizungstyp_id) REFERENCES heizungstypen (id)'); - $this->addSql('ALTER TABLE immobilien ADD CONSTRAINT FK_2C789DB74FDBEB FOREIGN KEY (bundesland_id) REFERENCES bundeslaender (id)'); - $this->addSql('CREATE INDEX IDX_2C789DC1B4DB52 ON immobilien (heizungstyp_id)'); - $this->addSql('CREATE INDEX IDX_2C789DB74FDBEB ON immobilien (bundesland_id)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('DROP TABLE bundeslaender'); - $this->addSql('DROP TABLE heizungstypen'); - $this->addSql('ALTER TABLE immobilien DROP FOREIGN KEY FK_2C789DC1B4DB52'); - $this->addSql('ALTER TABLE immobilien DROP FOREIGN KEY FK_2C789DB74FDBEB'); - $this->addSql('DROP INDEX IDX_2C789DC1B4DB52 ON immobilien'); - $this->addSql('DROP INDEX IDX_2C789DB74FDBEB ON immobilien'); - $this->addSql('ALTER TABLE immobilien ADD preis INT NOT NULL, ADD flaeche NUMERIC(8, 2) NOT NULL, ADD verfuegbar TINYINT(1) NOT NULL, ADD heizungstyp VARCHAR(255) DEFAULT NULL, ADD nebenkosten NUMERIC(6, 2) DEFAULT NULL, ADD bundesland VARCHAR(255) DEFAULT NULL, DROP wohnflaeche, DROP nutzflaeche, DROP heizungstyp_id, DROP bundesland_id'); - } -} diff --git a/migrations/Version20251108215623.php b/migrations/Version20251108215623.php deleted file mode 100644 index 5d82eaf..0000000 --- a/migrations/Version20251108215623.php +++ /dev/null @@ -1,33 +0,0 @@ -addSql('ALTER TABLE users ADD api_key VARCHAR(64) NOT NULL'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_1483A5E9C912ED9D ON users (api_key)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('DROP INDEX UNIQ_1483A5E9C912ED9D ON users'); - $this->addSql('ALTER TABLE users DROP api_key'); - } -} diff --git a/migrations/Version20251109100000.php b/migrations/Version20251109100000.php new file mode 100644 index 0000000..dd0ea57 --- /dev/null +++ b/migrations/Version20251109100000.php @@ -0,0 +1,120 @@ +addSql('CREATE TABLE users ( + id INT AUTO_INCREMENT NOT NULL, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + role VARCHAR(255) NOT NULL, + created_at DATETIME NOT NULL, + api_key VARCHAR(64) NOT NULL, + UNIQUE INDEX UNIQ_1483A5E9E7927C74 (email), + UNIQUE INDEX UNIQ_1483A5E9C912ED9D (api_key), + PRIMARY KEY (id) + ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB'); + + // Create bundeslaender table + $this->addSql('CREATE TABLE bundeslaender ( + id INT AUTO_INCREMENT NOT NULL, + name VARCHAR(100) NOT NULL, + grunderwerbsteuer NUMERIC(4, 2) NOT NULL, + UNIQUE INDEX UNIQ_DF7DFAB25E237E06 (name), + PRIMARY KEY (id) + ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB'); + + // Create heizungstypen table + $this->addSql('CREATE TABLE heizungstypen ( + id INT AUTO_INCREMENT NOT NULL, + name VARCHAR(100) NOT NULL, + UNIQUE INDEX UNIQ_6161C2A65E237E06 (name), + PRIMARY KEY (id) + ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB'); + + // Create immobilien table + $this->addSql('CREATE TABLE immobilien ( + id INT AUTO_INCREMENT NOT NULL, + verwalter_id INT NOT NULL, + heizungstyp_id INT DEFAULT NULL, + bundesland_id INT DEFAULT NULL, + adresse VARCHAR(255) NOT NULL, + wohnflaeche INT NOT NULL, + nutzflaeche INT NOT NULL, + garage TINYINT(1) NOT NULL, + zimmer INT NOT NULL, + baujahr INT DEFAULT NULL, + typ VARCHAR(255) NOT NULL, + beschreibung LONGTEXT DEFAULT NULL, + etage INT DEFAULT NULL, + kaufpreis INT DEFAULT NULL, + abschreibungszeit INT DEFAULT NULL, + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + INDEX IDX_2C789D3E5F66D3 (verwalter_id), + INDEX IDX_2C789DC1B4DB52 (heizungstyp_id), + INDEX IDX_2C789DB74FDBEB (bundesland_id), + PRIMARY KEY (id) + ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB'); + + // Add foreign keys + $this->addSql('ALTER TABLE immobilien ADD CONSTRAINT FK_2C789D3E5F66D3 FOREIGN KEY (verwalter_id) REFERENCES users (id)'); + $this->addSql('ALTER TABLE immobilien ADD CONSTRAINT FK_2C789DC1B4DB52 FOREIGN KEY (heizungstyp_id) REFERENCES heizungstypen (id)'); + $this->addSql('ALTER TABLE immobilien ADD CONSTRAINT FK_2C789DB74FDBEB FOREIGN KEY (bundesland_id) REFERENCES bundeslaender (id)'); + + // Populate Bundesländer with Grunderwerbsteuer rates + $this->addSql("INSERT INTO bundeslaender (name, grunderwerbsteuer) VALUES + ('Baden-Württemberg', 5.00), + ('Bayern', 3.50), + ('Berlin', 6.00), + ('Brandenburg', 6.50), + ('Bremen', 5.00), + ('Hamburg', 5.50), + ('Hessen', 6.00), + ('Mecklenburg-Vorpommern', 6.00), + ('Niedersachsen', 5.00), + ('Nordrhein-Westfalen', 6.50), + ('Rheinland-Pfalz', 5.00), + ('Saarland', 6.50), + ('Sachsen', 5.50), + ('Sachsen-Anhalt', 5.00), + ('Schleswig-Holstein', 6.50), + ('Thüringen', 5.00)"); + + // Populate Heizungstypen + $this->addSql("INSERT INTO heizungstypen (name) VALUES + ('Ölheizung'), + ('Gasheizung'), + ('Wärmepumpe'), + ('Pelletheizung')"); + } + + public function down(Schema $schema): void + { + // Drop all tables + $this->addSql('ALTER TABLE immobilien DROP FOREIGN KEY FK_2C789D3E5F66D3'); + $this->addSql('ALTER TABLE immobilien DROP FOREIGN KEY FK_2C789DC1B4DB52'); + $this->addSql('ALTER TABLE immobilien DROP FOREIGN KEY FK_2C789DB74FDBEB'); + $this->addSql('DROP TABLE immobilien'); + $this->addSql('DROP TABLE bundeslaender'); + $this->addSql('DROP TABLE heizungstypen'); + $this->addSql('DROP TABLE users'); + } +} diff --git a/src/Enum/Heizungstyp.php b/src/Enum/Heizungstyp.php index 34417ab..f388fbf 100644 --- a/src/Enum/Heizungstyp.php +++ b/src/Enum/Heizungstyp.php @@ -7,6 +7,7 @@ enum Heizungstyp: string case GASHEIZUNG = 'gasheizung'; case WAERMEPUMPE = 'waermepumpe'; case OELHEIZUNG = 'oelheizung'; + case PELLETHEIZUNG = 'pelletheizung'; public function getLabel(): string { @@ -14,6 +15,7 @@ enum Heizungstyp: string self::GASHEIZUNG => 'Gasheizung', self::WAERMEPUMPE => 'Wärmepumpe', self::OELHEIZUNG => 'Ölheizung', + self::PELLETHEIZUNG => 'Pelletheizung', }; } }