60 lines
2.2 KiB
PHP
60 lines
2.2 KiB
PHP
<?php
|
|
namespace Misuzu\Comments;
|
|
|
|
use stdClass;
|
|
use RuntimeException;
|
|
use Misuzu\MisuzuContext;
|
|
use Misuzu\Perm;
|
|
use Misuzu\Auth\AuthInfo;
|
|
use Misuzu\Users\UsersContext;
|
|
|
|
class CommentsEx {
|
|
public function __construct(
|
|
private AuthInfo $authInfo,
|
|
private Comments $comments,
|
|
private UsersContext $usersCtx
|
|
) {}
|
|
|
|
public function getCommentsForLayout(CommentsCategoryInfo|string $category): object {
|
|
$info = new stdClass;
|
|
if(is_string($category))
|
|
$category = $this->comments->ensureCategory($category);
|
|
|
|
$hasUser = $this->authInfo->isLoggedIn();
|
|
$info->user = $hasUser ? $this->authInfo->getUserInfo() : null;
|
|
$info->colour = $this->usersCtx->getUserColour($info->user);
|
|
$info->perms = $this->authInfo->getPerms('global')->checkMany([
|
|
'can_post' => Perm::G_COMMENTS_CREATE,
|
|
'can_delete' => Perm::G_COMMENTS_DELETE_OWN | Perm::G_COMMENTS_DELETE_ANY,
|
|
'can_delete_any' => Perm::G_COMMENTS_DELETE_ANY,
|
|
'can_pin' => Perm::G_COMMENTS_PIN,
|
|
'can_lock' => Perm::G_COMMENTS_LOCK,
|
|
'can_vote' => Perm::G_COMMENTS_VOTE,
|
|
]);
|
|
$info->category = $category;
|
|
$info->posts = [];
|
|
|
|
$root = $this->comments->getPosts($category, includeRepliesCount: true, includeVotesCount: true, replies: false);
|
|
foreach($root as $postInfo)
|
|
$info->posts[] = $this->decorateComment($postInfo);
|
|
|
|
return $info;
|
|
}
|
|
|
|
public function decorateComment(CommentsPostInfo $postInfo): object {
|
|
$userInfo = $postInfo->hasUserId() ? $this->usersCtx->getUserInfo($postInfo->getUserId()) : null;
|
|
|
|
$info = new stdClass;
|
|
$info->post = $postInfo;
|
|
$info->user = $userInfo;
|
|
$info->colour = $this->usersCtx->getUserColour($userInfo);
|
|
$info->vote = $this->comments->getPostVote($postInfo, $userInfo);
|
|
$info->replies = [];
|
|
|
|
$root = $this->comments->getPosts(parentInfo: $postInfo, includeRepliesCount: true, includeVotesCount: true);
|
|
foreach($root as $childInfo)
|
|
$info->replies[] = $this->decorateComment($childInfo);
|
|
|
|
return $info;
|
|
}
|
|
}
|