127 lines
4.3 KiB
PHP
127 lines
4.3 KiB
PHP
<?php
|
|
namespace Misuzu\Forum;
|
|
|
|
use RuntimeException;
|
|
use Index\Data\DbStatementCache;
|
|
use Index\Data\IDbConnection;
|
|
use Misuzu\Pagination;
|
|
use Misuzu\Users\UserInfo;
|
|
|
|
class ForumTopicRedirects {
|
|
private DbStatementCache $cache;
|
|
|
|
public function __construct(IDbConnection $dbConn) {
|
|
$this->cache = new DbStatementCache($dbConn);
|
|
}
|
|
|
|
public function countTopicRedirects(
|
|
UserInfo|string|null $userInfo = null
|
|
): int {
|
|
if($userInfo instanceof UserInfo)
|
|
$userInfo = $userInfo->getId();
|
|
|
|
$hasUserInfo = $userInfo !== null;
|
|
|
|
$query = 'SELECT COUNT(*) FROM msz_forum_topics_redirects';
|
|
if($hasUserInfo)
|
|
$query .= ' WHERE user_id = ?';
|
|
|
|
$stmt = $this->cache->get($query);
|
|
if($hasUserInfo)
|
|
$stmt->addParameter(1, $userInfo);
|
|
$stmt->execute();
|
|
|
|
$result = $stmt->getResult();
|
|
return $result->next() ? $result->getInteger(0) : 0;
|
|
}
|
|
|
|
public function getTopicRedirects(
|
|
UserInfo|string|null $userInfo = null,
|
|
?Pagination $pagination = null
|
|
): iterable {
|
|
if($userInfo instanceof UserInfo)
|
|
$userInfo = $userInfo->getId();
|
|
|
|
$hasUserInfo = $userInfo !== null;
|
|
$hasPagination = $pagination !== null;
|
|
|
|
$query = 'SELECT topic_id, user_id, topic_redir_url, UNIX_TIMESTAMP(topic_redir_created) FROM msz_forum_topics_redirects';
|
|
if($hasUserInfo)
|
|
$query .= ' WHERE user_id = ?';
|
|
if($hasPagination)
|
|
$query .= ' LIMIT ? OFFSET ?';
|
|
|
|
$args = 0;
|
|
$stmt = $this->cache->get($query);
|
|
if($hasUserInfo)
|
|
$stmt->addParameter(++$args, $userInfo);
|
|
if($hasPagination) {
|
|
$stmt->addParameter(++$args, $pagination->getRange());
|
|
$stmt->addParameter(++$args, $pagination->getOffset());
|
|
}
|
|
$stmt->execute();
|
|
|
|
return $stmt->getResult()->getIterator(ForumTopicRedirectInfo::fromResult(...));
|
|
}
|
|
|
|
public function hasTopicRedirect(ForumTopicInfo|string $topicInfo): bool {
|
|
if($topicInfo instanceof ForumTopicInfo)
|
|
$topicInfo = $topicInfo->getId();
|
|
|
|
$stmt = $this->cache->get('SELECT COUNT(*) FROM msz_forum_topics_redirects WHERE topic_id = ?');
|
|
$stmt->addParameter(1, $topicInfo);
|
|
$stmt->execute();
|
|
|
|
$result = $stmt->getResult();
|
|
if(!$result->next())
|
|
throw new RuntimeException('Was unable to check if a redirect exists.');
|
|
|
|
return $result->getInteger(0) > 0;
|
|
}
|
|
|
|
public function getTopicRedirect(ForumTopicInfo|string $topicInfo): ForumTopicRedirectInfo {
|
|
if($topicInfo instanceof ForumTopicInfo)
|
|
$topicInfo = $topicInfo->getId();
|
|
|
|
$stmt = $this->cache->get('SELECT topic_id, user_id, topic_redir_url, UNIX_TIMESTAMP(topic_redir_created) FROM msz_forum_topics_redirects WHERE topic_id = ?');
|
|
$stmt->addParameter(1, $topicInfo);
|
|
$stmt->execute();
|
|
|
|
$result = $stmt->getResult();
|
|
if(!$result->next())
|
|
throw new RuntimeException('Could not find that forum topic redirect.');
|
|
|
|
return ForumTopicRedirectInfo::fromResult($result);
|
|
}
|
|
|
|
public function createTopicRedirect(
|
|
ForumTopicInfo|string $topicInfo,
|
|
UserInfo|string|null $userInfo,
|
|
string $linkTarget
|
|
): ForumTopicRedirectInfo {
|
|
if($topicInfo instanceof ForumTopicInfo)
|
|
$topicInfo = $topicInfo->getId();
|
|
if($userInfo instanceof UserInfo)
|
|
$userInfo = $userInfo->getId();
|
|
|
|
$stmt = $this->cache->get('INSERT INTO msz_forum_topics_redirects (topic_id, user_id, topic_redir_url) VALUES (?, ?, ?)');
|
|
$stmt->addParameter(1, $topicInfo);
|
|
$stmt->addParameter(2, $userInfo);
|
|
$stmt->addParameter(3, $linkTarget);
|
|
$stmt->execute();
|
|
|
|
return $this->getTopicRedirect($topicInfo);
|
|
}
|
|
|
|
public function deleteTopicRedirect(ForumTopicRedirectInfo|ForumTopicInfo|string $topicInfo): void {
|
|
if($topicInfo instanceof ForumTopicRedirectInfo)
|
|
$topicInfo = $topicInfo->getTopicId();
|
|
elseif($topicInfo instanceof ForumTopicInfo)
|
|
$topicInfo = $topicInfo->getId();
|
|
|
|
$stmt = $this->cache->get('DELETE FROM msz_forum_topics_redirects WHERE topic_id = ?');
|
|
$stmt->addParameter(1, $topicInfo);
|
|
$stmt->execute();
|
|
}
|
|
}
|