ArticleManager um LIKES erweitert...
Einführung einer dynamischen Like-Funktion für Beiträge
This commit is contained in:
@@ -23,6 +23,7 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
|
||||
$db = $this->getConnection();
|
||||
|
||||
// Tabelle für Beiträge
|
||||
$db->exec("
|
||||
CREATE TABLE articles (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
@@ -33,6 +34,15 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
tags TEXT,
|
||||
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);");
|
||||
|
||||
// Tabelle für Likes
|
||||
$db->exec("
|
||||
CREATE TABLE likes (
|
||||
article_id INTEGER,
|
||||
user_id TEXT,
|
||||
PRIMARY KEY (article_id, user_id),
|
||||
FOREIGN KEY (article_id) REFERENCES articles(id) ON DELETE CASCADE
|
||||
);");
|
||||
unset($db);
|
||||
} catch (PDOException $e) {
|
||||
throw new InternalServerErrorException($e->getMessage());
|
||||
@@ -189,6 +199,8 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
$row = $command->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($row) {
|
||||
$likes = $this->getLikesForArticle(intval($row['id']));
|
||||
|
||||
return new Article(
|
||||
intval($row['id']),
|
||||
$row['title'],
|
||||
@@ -196,7 +208,8 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
$row['author'],
|
||||
$row['category'],
|
||||
$row['tags'],
|
||||
$row['created']
|
||||
$row['created'],
|
||||
$likes
|
||||
);
|
||||
}
|
||||
|
||||
@@ -254,6 +267,8 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
$filteredArticles = [];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$likes = $this->getLikesForArticle(intval($row['id']));
|
||||
|
||||
$filteredArticles[] = new Article(
|
||||
intval($row['id']),
|
||||
$row['title'],
|
||||
@@ -261,7 +276,8 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
$row['author'],
|
||||
$row['category'],
|
||||
$row['tags'],
|
||||
$row['created']
|
||||
$row['created'],
|
||||
$likes
|
||||
);
|
||||
}
|
||||
|
||||
@@ -287,6 +303,8 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
$filteredArticles = [];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$likes = $this->getLikesForArticle(intval($row['id']));
|
||||
|
||||
$filteredArticles[] = new Article(
|
||||
intval($row['id']),
|
||||
$row['title'],
|
||||
@@ -294,7 +312,8 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
$row['author'],
|
||||
$row['category'],
|
||||
$row['tags'],
|
||||
$row['created']
|
||||
$row['created'],
|
||||
$likes
|
||||
);
|
||||
}
|
||||
|
||||
@@ -341,6 +360,8 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
$filteredArticles = [];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$likes = $this->getLikesForArticle(intval($row['id']));
|
||||
|
||||
$filteredArticles[] = new Article(
|
||||
intval($row['id']),
|
||||
$row['title'] ?? '',
|
||||
@@ -348,7 +369,8 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
$row['author'] ?? '',
|
||||
$row['category'] ?? '',
|
||||
$row['tags'] ?? '',
|
||||
$row['created'] ?? '' // Nutzt 'created' aus deiner DB-Struktur
|
||||
$row['created'] ?? '',
|
||||
$likes
|
||||
);
|
||||
}
|
||||
|
||||
@@ -359,4 +381,69 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Holt alle User-IDs, die einen bestimmten Beitrag geliked haben.
|
||||
*
|
||||
* @return String[] UserIDs
|
||||
* @throws InternalServerErrorException
|
||||
*/
|
||||
private function getLikesForArticle(int $articleId): array
|
||||
{
|
||||
try {
|
||||
$db = $this->getConnection();
|
||||
$sql = "SELECT user_id FROM likes WHERE article_id = :article_id;";
|
||||
$command = $db->prepare($sql);
|
||||
$command->execute([':article_id' => $articleId]);
|
||||
|
||||
return $command->fetchAll(PDO::FETCH_COLUMN) ?: [];
|
||||
} catch (PDOException $e) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
public function toggleLike(int $articleId, string $userId): bool
|
||||
{
|
||||
// prüfen, ob der Artikel überhaupt existiert
|
||||
$article = $this->getArticle($articleId);
|
||||
if (!$article) {
|
||||
throw new NotFoundException("missing_id");
|
||||
}
|
||||
|
||||
try {
|
||||
$db = $this->getConnection();
|
||||
|
||||
// prüfen, ob das Like bereits existiert
|
||||
$checkSql = "SELECT COUNT(*) FROM likes WHERE article_id = :article_id AND user_id = :user_id;";
|
||||
$checkCommand = $db->prepare($checkSql);
|
||||
$checkCommand->execute([
|
||||
':article_id' => $articleId,
|
||||
':user_id' => $userId
|
||||
]);
|
||||
|
||||
$hasLiked = (int)$checkCommand->fetchColumn() > 0;
|
||||
|
||||
if ($hasLiked) {
|
||||
// wenn bereits geliked -> Unlike
|
||||
$deleteSql = "DELETE FROM likes WHERE article_id = :article_id AND user_id = :user_id;";
|
||||
$deleteCommand = $db->prepare($deleteSql);
|
||||
$deleteCommand->execute([
|
||||
':article_id' => $articleId,
|
||||
':user_id' => $userId
|
||||
]);
|
||||
return false; // gibt false zurück, da der Beitrag jetzt nicht mehr geliked ist
|
||||
} else {
|
||||
// wenn noch nicht geliked -> Like
|
||||
$insertSql = "INSERT INTO likes (article_id, user_id) VALUES (:article_id, :user_id);";
|
||||
$insertCommand = $db->prepare($insertSql);
|
||||
$insertCommand->execute([
|
||||
':article_id' => $articleId,
|
||||
':user_id' => $userId
|
||||
]);
|
||||
return true; // gibt true zurück, da der Beitrag jetzt geliked ist
|
||||
}
|
||||
|
||||
} catch (PDOException $e) {
|
||||
throw new InternalServerErrorException("internal_error");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user