pdo = Database::getInstance()->getPdo(); } /** * Toggle a like: insert if not yet liked, delete if already liked. * Returns true if the post is now liked, false if unliked. */ public function toggle(int $userId, int $postId): bool { // INSERT IGNORE silently fails when the UNIQUE(user_id, post_id) constraint // is violated, meaning the user already liked this post $stmt = $this->pdo->prepare( 'INSERT IGNORE INTO likes (user_id, post_id) VALUES (:user_id, :post_id)' ); $stmt->execute(['user_id' => $userId, 'post_id' => $postId]); if ($stmt->rowCount() > 0) { return true; } // Row wasn't inserted → already liked → remove the like $stmt = $this->pdo->prepare( 'DELETE FROM likes WHERE user_id = :user_id AND post_id = :post_id' ); $stmt->execute(['user_id' => $userId, 'post_id' => $postId]); return false; } public function countByPost(int $postId): int { $stmt = $this->pdo->prepare('SELECT COUNT(*) FROM likes WHERE post_id = :post_id'); $stmt->execute(['post_id' => $postId]); return (int) $stmt->fetchColumn(); } public function hasUserLiked(int $userId, int $postId): bool { $stmt = $this->pdo->prepare( 'SELECT 1 FROM likes WHERE user_id = :user_id AND post_id = :post_id LIMIT 1' ); $stmt->execute(['user_id' => $userId, 'post_id' => $postId]); return $stmt->fetch() !== false; } }