misuzu/src/Comments/CommentsEx.php

61 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;
}
}