file = __DIR__ . '/../../data/articles.json'; } /** * Gibt die LocalArticleManager-Instanz zurück. * @return LocalArticleManager */ public static function getInstance() { if (self::$instance == null) { self::$instance = new LocalArticleManager(); } return self::$instance; } /** * Speichert alle Artikel/Beiträge in der Datei. * @param $articles * @return void * @throws InternalServerErrorException */ private function saveArticle($articles) { try{ file_put_contents( $this->file, json_encode($articles, JSON_PRETTY_PRINT) ); }catch (Exception $e){ throw new InternalServerErrorException($e->getMessage()); } } public function addArticle($title, $content, $author, $category, $tags) { $articles = $this->getAllArticles(); $articles[] = [ "id" => count($articles)+1, "title" => $title, "content" => $content, "author" => $author, "category" => $category, "tags" => $tags, "creationDate" => date("Y-m-d H:i:s") ]; $this->saveArticle($articles); } public function updateArticle($id, $article, $author) { if (empty($article)) { throw new NotFoundException("not_found_article"); } // Berechtigungsprüfung: if ($article->getAuthor() !== $author) { throw new UnauthorizedAccessException("unauthorized_access"); } // Beitrag aktualisieren: $articles = $this->getAllArticles(); $updated = false; foreach ($articles as $index => $storedArticle) { if (isset($storedArticle['id']) && $storedArticle['id'] == $id) { $articles[$index] = [ "id" => $id, "title" => $article->getTitle(), "content" => $article->getContent(), "author" => $author, "category" => $article->getCategory(), "tags" => $article->getTags(), "creationDate" => $article->getCreationDate() ]; $updated = true; break; } } // Nur speichern, wenn Beitrag geändert wurde: if ($updated) { $this->saveArticle($articles); } else { throw new NotFoundException("missing_id"); } } public function deleteArticle($id, $author) { $article = getArticle($id); if (empty($article)) { throw new NotFoundException("not_found_article"); } // Berechtigungsprüfung: if ($article->getAuthor() !== $author) { throw new UnauthorizedAccessException("unauthorized_access"); } $articles = $this->getAllArticles(); $articleFound = false; foreach ($articles as $index => $article) { if (isset($article['id']) && $article['id'] == $id) { unset($articles[$index]); $articleFound = true; break; // Schleife abbrechen, da die ID eindeutig ist } } if ($articleFound) { // array_values stellt sicher, dass die Array-Keys wieder fortlaufend bei 0 beginnen $this->saveArticle(array_values($articles)); } } public function getArticle($id) { $articles = $this->getAllArticles(); foreach ($articles as $article) { if (isset($article['id']) && $article['id'] == $id) { return new Article(intval($article['id']), $article['title'], $article['content'], $article['author'], $article['category'], $article['tags'], $article['creationDate']); } } return null; } public function getAllArticles(): array { if (!file_exists($this->file)) { return []; } $json = file_get_contents($this->file); $articles = json_decode($json, true); return is_array($articles) ? $articles : []; } public function getArticlesByAuthor($author) { $articles = $this->getAllArticles(); $filteredArticles = []; foreach ($articles as $article) { if (isset($article['author']) && $article['author'] == $author) { $filteredArticles[] = new Article( intval($article['id']), $article['title'], $article['content'], $article['author'], $article['category'], $article['tags'], $article['creationDate'] ); } } return $filteredArticles; } public function search(string $keyword): array { $articles = $this->getAllArticles(); $filteredArticles = []; if (!is_array($articles)) { return []; } $cleanKeyword = strtolower(trim($keyword)); foreach ($articles as $article) { $title = isset($article['title']) ? strtolower((string)$article['title']) : ''; $content = isset($article['content']) ? strtolower((string)$article['content']) : ''; if (($cleanKeyword !== '' && strpos($title, $cleanKeyword) !== false) || ($cleanKeyword !== '' && strpos($content, $cleanKeyword) !== false)) { $filteredArticles[] = new Article( intval($article['id'] ?? 0), $article['title'] ?? '', $article['content'] ?? '', $article['author'] ?? '', $article['category'] ?? '', $article['tags'] ?? '', $article['creationDate'] ?? '' ); } } return $filteredArticles; } public function getArticlesByCategory($category) { $articles = $this->getAllArticles(); $filteredArticles = []; foreach ($articles as $article) { if (isset($article['category']) && $article['category'] == $category) { $filteredArticles[] = new Article( intval($article['id']), $article['title'], $article['content'], $article['author'], $article['category'], $article['tags'], $article['creationDate'] ); } } return $filteredArticles; } } ?>