imageHandler = new ImageHandler(); } protected function getType(): string { return 'Movie'; } protected function getTypeSpecificFields(): array { return ['runtime', 'director', 'writer']; } protected function validateTypeSpecificFields(array $data): array { // Movies sollten bestimmte Felder haben if (isset($data['runtime']) && !is_numeric($data['runtime'])) { throw new Exception('Runtime must be a number'); } return $data; } protected function processPosterField(array $data): array { error_log("Movie::processPosterField - Checking for poster field, isUpdate: " . ($this->isUpdate ? 'yes' : 'no')); // If this is an update and poster is being changed, delete old image if ($this->isUpdate && $this->mediaId && isset($data['poster']) && !empty($data['poster'])) { $currentMedia = $this->findById($this->mediaId); if ($currentMedia && !empty($currentMedia['poster'])) { $oldPoster = $currentMedia['poster']; if (strpos($oldPoster, '/images/') === 0) { error_log("Movie::processPosterField - Deleting old poster: " . $oldPoster); $this->imageHandler->deleteImage($oldPoster); } } } if (isset($data['poster']) && !empty($data['poster'])) { error_log("Movie::processPosterField - Poster found, length: " . strlen($data['poster'])); if (strpos($data['poster'], '/images/') === 0 || filter_var($data['poster'], FILTER_VALIDATE_URL)) { error_log("Movie::processPosterField - Poster is already a path or URL, skipping processing"); return $data; } $posterPath = $this->imageHandler->saveBase64Image($data['poster'], 'movies/poster'); error_log("Movie::processPosterField - ImageHandler returned: " . ($posterPath ?: 'null')); if ($posterPath) { $data['poster'] = $posterPath; error_log("Movie::processPosterField - Poster path set to: " . $posterPath); } else { error_log("Movie::processPosterField - Failed to process poster, keeping original data"); } } else { error_log("Movie::processPosterField - No poster field found or empty"); } return $data; } public function createWithRelations(array $data): int { $data['type'] = 'Movie'; $data = $this->validateTypeSpecificFields($data); $data = $this->processPosterField($data); return parent::createWithRelations($data); } public function updateWithRelations(int $id, array $data): bool { $this->isUpdate = true; $this->mediaId = $id; $this->validateTypeSpecificFields($data); $data = $this->processPosterField($data); return parent::updateWithRelations($id, $data); } public function search(array $filters = [], int $page = 1, int $limit = 20): array { // Nur Movies suchen $filters['type'] = 'Movie'; return parent::search($filters, $page, $limit); } }