<?php
/**
- * @copyright Copyright (C) 2010-2022, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
- * See update_profile.php for documentation
*/
namespace Friendica\Module\Item;
use Friendica\Model\Profile;
use Friendica\Model\User;
use Friendica\Module\Response;
+use Friendica\Module\Special\DisplayNotFound;
use Friendica\Navigation\Notifications\Repository\Notification;
use Friendica\Navigation\Notifications\Repository\Notify;
use Friendica\Protocol\ActivityPub;
use Friendica\Content\Widget;
use Psr\Log\LoggerInterface;
+/**
+ * Controller to display one item and its conversation
+ */
class Display extends BaseModule
{
/** @var App\Page */
}
if ($item['gravity'] != Item::GRAVITY_PARENT) {
- $parent = Post::selectFirstForUser($itemUid, $fields, [
+ $parent = Post::selectFirst($fields, [
'uid' => [0, $itemUid],
'uri-id' => $item['parent-uri-id']
], ['order' => ['uid' => true]]);
- $item = $parent ?: $item;
+
+ $item = $parent ?: $item;
}
if (!$this->pConfig->get($this->session->getLocalUserId(), 'system', 'detailed_notif')) {
protected function getDisplayData(array $item, bool $update = false, int $updateUid = 0, bool $force = false): string
{
- $isRemoteContact = false;
- $itemUid = $this->session->getLocalUserId();
+ $itemUid = $this->session->getLocalUserId();
$parent = null;
if (!$this->session->getLocalUserId() && !empty($item['parent-uri-id'])) {
if (!empty($parent)) {
$pageUid = $parent['uid'];
- $isRemoteContact = $this->session->getRemoteContactID($pageUid);
- if ($isRemoteContact) {
+ if ($this->session->getRemoteContactID($pageUid)) {
$itemUid = $parent['uid'];
}
} else {
}
if (!empty($pageUid) && ($pageUid != $this->session->getLocalUserId())) {
- $page_user = User::getById($pageUid, ['hidewall']);
+ $page_user = User::getById($pageUid, ['nickname', 'hidewall']);
}
- $is_owner = $this->session->getLocalUserId() && (in_array($pageUid, [$this->session->getLocalUserId(), 0]));
-
- if (!empty($page_user['hidewall']) && !$is_owner && !$isRemoteContact) {
- throw new HTTPException\ForbiddenException($this->t('Access to this profile has been restricted.'));
+ if (!empty($page_user['hidewall']) && !$this->session->isAuthenticated()) {
+ $this->baseUrl->redirect('profile/' . $page_user['nickname'] . '/restricted');
}
$sql_extra = Item::getPermissionsSQLByUserId($pageUid);
if ($this->session->getLocalUserId() && ($this->session->getLocalUserId() == $pageUid)) {
- $condition = [
+ $unseen = Post::exists([
'parent-uri-id' => $item['parent-uri-id'],
'uid' => $this->session->getLocalUserId(),
'unseen' => true
- ];
- $unseen = Post::exists($condition);
+ ]);
} else {
$unseen = false;
}
}
$condition = ["`uri-id` = ? AND `uid` IN (0, ?) " . $sql_extra, $item['uri-id'], $itemUid];
- $fields = ['parent-uri-id', 'body', 'title', 'author-name', 'author-avatar', 'plink', 'author-id',
- 'owner-id', 'contact-id'];
- $item = Post::selectFirstForUser($pageUid, $fields, $condition);
+ $fields = [
+ 'parent-uri-id', 'body', 'title', 'author-name', 'author-avatar', 'plink', 'author-id',
+ 'owner-id', 'contact-id'
+ ];
+
+ $item = Post::selectFirstForUser($pageUid, $fields, $condition);
if (empty($item)) {
- throw new HTTPException\NotFoundException($this->t('The requested item doesn\'t exist or has been deleted.'));
+ $this->page['aside'] = '';
+ $displayNotFound = new DisplayNotFound($this->l10n, $this->baseUrl, $this->args, $this->logger, $this->profiler, $this->response, $this->server, $this->parameters);
+ return $displayNotFound->content();
}
$item['uri-id'] = $item['parent-uri-id'];
$output = '';
+ $is_owner = $this->session->getLocalUserId() && (in_array($pageUid, [$this->session->getLocalUserId(), 0]));
+
// We need the editor here to be able to reshare an item.
if ($is_owner && !$update) {
$output .= $this->conversation->statusEditor([], 0, true);
}
- $output .= $this->conversation->create([$item], 'display', $updateUid, false, 'commented', $itemUid);
+ $output .= $this->conversation->render([$item], Conversation::MODE_DISPLAY, $updateUid, false, 'commented', $itemUid);
return $output;
}
{
if (Post::exists(['uri-id' => $uriId, 'private' => [Item::PUBLIC, Item::UNLISTED]])) {
// For the atom feed the nickname doesn't matter at all, we only need the item id.
- $alternate = sprintf('display/feed-item/%s.atom', $uriId);
- $conversation = sprintf('display/feed-item/%s/conversation.atom', $parentUriId);
- $this->page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('display-head.tpl'),
- ['$alternate' => $alternate,
- '$conversation' => $conversation]);
+ $this->page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('display-head.tpl'), [
+ '$alternate' => sprintf('display/feed-item/%s.atom', $uriId),
+ '$conversation' => sprintf('display/feed-item/%s/conversation.atom', $parentUriId)
+ ]);
}
}
$page = $this->page;
- if (Contact::exists(['unsearchable' => true,
- 'id' => [$item['contact-id'], $item['author-id'], $item['owner-id']]])) {
+ if (Contact::exists([
+ 'unsearchable' => true, 'id' => [$item['contact-id'], $item['author-id'], $item['owner-id']]
+ ])) {
$page['htmlhead'] .= "<meta content=\"noindex, noarchive\" name=\"robots\" />\n";
}