]> git.mxchange.org Git - friendica.git/blobdiff - src/Object/Post.php
Change FollowRequest to return the user ID so is compatible with POST endpoint
[friendica.git] / src / Object / Post.php
index bbce29672712ec7c7d298919541127e360ca462b..0a05429dfda19e7f02c8f7c4021f69a40356198b 100644 (file)
@@ -1,6 +1,6 @@
 <?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
  *
@@ -28,7 +28,6 @@ use Friendica\Core\Hook;
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Core\Renderer;
-use Friendica\Core\Session;
 use Friendica\DI;
 use Friendica\Model\Contact;
 use Friendica\Model\Item;
@@ -87,7 +86,7 @@ class Post
                $this->setTemplate('wall');
                $this->toplevel = $this->getId() == $this->getDataValue('parent');
 
-               if (!empty(Session::getUserIDForVisitorContactID($this->getDataValue('contact-id')))) {
+               if (!empty(DI::userSession()->getUserIDForVisitorContactID($this->getDataValue('contact-id')))) {
                        $this->visiting = true;
                }
 
@@ -104,14 +103,14 @@ class Post
                if (!empty($data['children'])) {
                        foreach ($data['children'] as $item) {
                                // Only add will be displayed
-                               if ($item['network'] === Protocol::MAIL && local_user() != $item['uid']) {
+                               if ($item['network'] === Protocol::MAIL && DI::userSession()->getLocalUserId() != $item['uid']) {
                                        continue;
                                } elseif (!DI::contentItem()->isVisibleActivity($item)) {
                                        continue;
                                }
 
                                // You can always comment on Diaspora and OStatus items
-                               if (in_array($item['network'], [Protocol::OSTATUS, Protocol::DIASPORA]) && (local_user() == $item['uid'])) {
+                               if (in_array($item['network'], [Protocol::OSTATUS, Protocol::DIASPORA]) && (DI::userSession()->getLocalUserId() == $item['uid'])) {
                                        $item['writable'] = true;
                                }
 
@@ -192,7 +191,7 @@ class Post
                $pinned = '';
                $pin = false;
                $star = false;
-               $ignore = false;
+               $ignore_thread = false;
                $ispinned = 'unpinned';
                $isstarred = 'unstarred';
                $indent = '';
@@ -206,7 +205,7 @@ class Post
                $lock      = ($item['private'] == Item::PRIVATE) ? $privacy : false;
                $connector = !in_array($item['network'], Protocol::NATIVE_SUPPORT) ? DI::l10n()->t('Connector Message') : false;
 
-               $shareable = in_array($conv->getProfileOwner(), [0, local_user()]) && $item['private'] != Item::PRIVATE;
+               $shareable = in_array($conv->getProfileOwner(), [0, DI::userSession()->getLocalUserId()]) && $item['private'] != Item::PRIVATE;
                $announceable = $shareable && in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::TWITTER]);
 
                // On Diaspora only toplevel posts can be reshared
@@ -216,15 +215,15 @@ class Post
 
                $edpost = false;
 
-               if (local_user()) {
+               if (DI::userSession()->getLocalUserId()) {
                        if (Strings::compareLink(DI::session()->get('my_url'), $item['author-link'])) {
                                if ($item['event-id'] != 0) {
-                                       $edpost = ['events/event/' . $item['event-id'], DI::l10n()->t('Edit')];
+                                       $edpost = ['calendar/event/edit/' . $item['event-id'], DI::l10n()->t('Edit')];
                                } else {
-                                       $edpost = ['editpost/' . $item['id'], DI::l10n()->t('Edit')];
+                                       $edpost = [sprintf('post/%s/edit', $item['id']), DI::l10n()->t('Edit')];
                                }
                        }
-                       $dropping = in_array($item['uid'], [0, local_user()]);
+                       $dropping = in_array($item['uid'], [0, DI::userSession()->getLocalUserId()]);
                }
 
                // Editing on items of not subscribed users isn't currently possible
@@ -234,7 +233,7 @@ class Post
                        $edpost = false;
                }
 
-               if (($this->getDataValue('uid') == local_user()) || $this->isVisiting()) {
+               if (($this->getDataValue('uid') == DI::userSession()->getLocalUserId()) || $this->isVisiting()) {
                        $dropping = true;
                }
 
@@ -247,9 +246,10 @@ class Post
                // Showing the one or the other text, depending upon if we can only hide it or really delete it.
                $delete = $origin ? DI::l10n()->t('Delete globally') : DI::l10n()->t('Remove locally');
 
-               $drop = false;
-               $block = false;
-               if (local_user()) {
+               $drop   = false;
+               $block  = false;
+               $ignore = false;
+               if (DI::userSession()->getLocalUserId()) {
                        $drop = [
                                'dropping' => $dropping,
                                'pagedrop' => $item['pagedrop'],
@@ -258,22 +258,27 @@ class Post
                        ];
                }
 
-               if (!$item['self'] && local_user()) {
+               if (!$item['self'] && DI::userSession()->getLocalUserId()) {
                        $block = [
-                               'blocking' => true,
-                               'block'   => DI::l10n()->t('Block %s', $item['author-name']),
-                               'author_id'   => $item['author-id'],
+                               'blocking'  => true,
+                               'block'     => DI::l10n()->t('Block %s', $item['author-name']),
+                               'author_id' => $item['author-id'],
+                       ];
+                       $ignore = [
+                               'ignoring'  => true,
+                               'ignore'    => DI::l10n()->t('Ignore %s', $item['author-name']),
+                               'author_id' => $item['author-id'],
                        ];
                }
 
-               $filer = local_user() ? DI::l10n()->t('Save to folder') : false;
+               $filer = DI::userSession()->getLocalUserId() ? DI::l10n()->t('Save to folder') : false;
 
                $profile_name = $item['author-name'];
                if (!empty($item['author-link']) && empty($item['author-name'])) {
                        $profile_name = $item['author-link'];
                }
 
-               if (Session::isAuthenticated()) {
+               if (DI::userSession()->isAuthenticated()) {
                        $author = ['uid' => 0, 'id' => $item['author-id'],
                                'network' => $item['author-network'], 'url' => $item['author-link']];
                        $profile_link = Contact::magicLinkByContact($author);
@@ -281,7 +286,7 @@ class Post
                        $profile_link = $item['author-link'];
                }
 
-               if (strpos($profile_link, 'redir/') === 0) {
+               if (strpos($profile_link, 'contact/redir/') === 0) {
                        $sparkle = ' sparkle';
                }
 
@@ -327,15 +332,15 @@ class Post
                $tagger = '';
 
                if ($this->isToplevel()) {
-                       if (local_user()) {
-                               $ignored = PostModel\ThreadUser::getIgnored($item['uri-id'], local_user());
-                               if ($item['mention'] || $ignored) {
-                                       $ignore = [
+                       if (DI::userSession()->getLocalUserId()) {
+                               $ignored_thread = PostModel\ThreadUser::getIgnored($item['uri-id'], DI::userSession()->getLocalUserId());
+                               if ($item['mention'] || $ignored_thread) {
+                                       $ignore_thread = [
                                                'do'        => DI::l10n()->t('Ignore thread'),
                                                'undo'      => DI::l10n()->t('Unignore thread'),
                                                'toggle'    => DI::l10n()->t('Toggle ignore status'),
-                                               'classdo'   => $ignored ? 'hidden' : '',
-                                               'classundo' => $ignored ? '' : 'hidden',
+                                               'classdo'   => $ignored_thread ? 'hidden' : '',
+                                               'classundo' => $ignored_thread ? '' : 'hidden',
                                                'ignored'   => DI::l10n()->t('Ignored'),
                                        ];
                                }
@@ -351,7 +356,7 @@ class Post
                                        'starred'   => DI::l10n()->t('Starred'),
                                ];
 
-                               if ($conv->getProfileOwner() == local_user() && ($item['uid'] != 0)) {
+                               if ($conv->getProfileOwner() == DI::userSession()->getLocalUserId() && ($item['uid'] != 0)) {
                                        if ($origin && in_array($item['private'], [Item::PUBLIC, Item::UNLISTED])) {
                                                $ispinned = ($item['featured'] ? 'pinned' : 'unpinned');
 
@@ -397,17 +402,17 @@ class Post
 
                $body_html = Item::prepareBody($item, true);
 
-               list($categories, $folders) = DI::contentItem()->determineCategoriesTerms($item, local_user());
+               list($categories, $folders) = DI::contentItem()->determineCategoriesTerms($item, DI::userSession()->getLocalUserId());
 
                if (!empty($item['title'])) {
                        $title = $item['title'];
-               } elseif (!empty($item['content-warning']) && DI::pConfig()->get(local_user(), 'system', 'disable_cw', false)) {
+               } elseif (!empty($item['content-warning']) && DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'disable_cw', false)) {
                        $title = ucfirst($item['content-warning']);
                } else {
                        $title = '';
                }
 
-               if (DI::pConfig()->get(local_user(), 'system', 'hide_dislike')) {
+               if (DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'hide_dislike')) {
                        $buttons['dislike'] = false;
                }
 
@@ -434,7 +439,7 @@ class Post
                }
 
                // Fetching of Diaspora posts doesn't always work. There are issues with reshares and possibly comments
-               if (!local_user() && ($item['network'] != Protocol::DIASPORA) && !empty(DI::session()->get('remote_comment'))) {
+               if (!DI::userSession()->getLocalUserId() && ($item['network'] != Protocol::DIASPORA) && !empty(DI::session()->get('remote_comment'))) {
                        $remote_comment = [DI::l10n()->t('Comment this item on your system'), DI::l10n()->t('Remote comment'),
                                str_replace('{uri}', urlencode($item['uri']), DI::session()->get('remote_comment'))];
 
@@ -519,12 +524,13 @@ class Post
                        'pinned'          => $pinned,
                        'isstarred'       => $isstarred,
                        'star'            => $star,
-                       'ignore'          => $ignore,
+                       'ignore'          => $ignore_thread,
                        'tagger'          => $tagger,
                        'filer'           => $filer,
                        'language'        => $languages,
                        'drop'            => $drop,
                        'block'           => $block,
+                       'ignore_author'   => $ignore,
                        'vote'            => $buttons,
                        'like_html'       => $responses['like']['output'],
                        'dislike_html'    => $responses['dislike']['output'],
@@ -586,18 +592,12 @@ class Post
                        }
                }
 
+               // Copy values/set defaults
                $result['total_comments_num'] = $this->isToplevel() ? $total_children : 0;
-
-               $result['private'] = $item['private'];
-               $result['toplevel'] = ($this->isToplevel() ? 'toplevel_item' : '');
-
-               if ($this->isThreaded()) {
-                       $result['flatten'] = false;
-                       $result['threaded'] = true;
-               } else {
-                       $result['flatten'] = true;
-                       $result['threaded'] = false;
-               }
+               $result['private']            = $item['private'];
+               $result['toplevel']           = ($this->isToplevel() ? 'toplevel_item' : '');
+               $result['flatten']            = !$this->isThreaded();
+               $result['threaded']           = $this->isThreaded();
 
                return $result;
        }
@@ -619,33 +619,32 @@ class Post
        }
 
        /**
-        * Add a child item
+        * Add a child post
         *
-        * @param Post $item The child item to add
+        * @param Post $item The child post to add
         *
-        * @return mixed
+        * @return Post|bool Last Post object or bool on any error
         * @throws \Exception
         */
        public function addChild(Post $item)
        {
-               $item_id = $item->getId();
-               if (!$item_id) {
-                       Logger::info('[ERROR] Post::addChild : Item has no ID!!');
+               if (!$item->getId()) {
+                       Logger::error('Post object has no id', ['post' => $item]);
                        return false;
                } elseif ($this->getChild($item->getId())) {
-                       Logger::info('[WARN] Post::addChild : Item already exists (' . $item->getId() . ').');
+                       Logger::warning('Post object already exists', ['post' => $item]);
                        return false;
                }
 
-               $activity = DI::activity();
-
                /*
                 * Only add what will be displayed
                 */
-               if ($item->getDataValue('network') === Protocol::MAIL && local_user() != $item->getDataValue('uid')) {
+               if ($item->getDataValue('network') === Protocol::MAIL && DI::userSession()->getLocalUserId() != $item->getDataValue('uid')) {
+                       Logger::warning('Post object does not belong to local user', ['post' => $item, 'local_user' => DI::userSession()->getLocalUserId()]);
                        return false;
-               } elseif ($activity->match($item->getDataValue('verb'), Activity::LIKE) ||
-                         $activity->match($item->getDataValue('verb'), Activity::DISLIKE)) {
+               } elseif (DI::activity()->match($item->getDataValue('verb'), Activity::LIKE) ||
+                         DI::activity()->match($item->getDataValue('verb'), Activity::DISLIKE)) {
+                       Logger::warning('Post objects is a like/dislike', ['post' => $item]);
                        return false;
                }
 
@@ -659,7 +658,7 @@ class Post
         * Get a child by its ID
         *
         * @param integer $id The child id
-        * @return mixed
+        * @return Thread|null Thread or NULL if not found
         */
        public function getChild(int $id)
        {
@@ -748,6 +747,7 @@ class Post
         * Set conversation thread
         *
         * @param Thread|null $thread
+        *
         * @return void
         */
        public function setThread(Thread $thread = null)
@@ -786,6 +786,7 @@ class Post
         * Get a data value
         *
         * @param string $name key
+        *
         * @return mixed value on success, false on failure
         */
        public function getDataValue(string $name)
@@ -799,13 +800,14 @@ class Post
        }
 
        /**
-        * Set template
+        * Set template by name
         *
         * @param string $name Template name
-        * @return bool If template was set
+        *
+        * @return void
         * @throws InvalidArgumentException
         */
-       private function setTemplate(string $name): bool
+       private function setTemplate(string $name)
        {
                if (empty($this->available_templates[$name])) {
                        // Throw exception
@@ -813,8 +815,6 @@ class Post
                }
 
                $this->template = $this->available_templates[$name];
-
-               return true;
        }
 
        /**
@@ -850,7 +850,7 @@ class Post
                        // This will allow us to comment on wall-to-wall items owned by our friends
                        // and community forums even if somebody else wrote the post.
                        // bug #517 - this fixes for conversation owner
-                       if ($conv->getMode() == 'profile' && $conv->getProfileOwner() == local_user()) {
+                       if ($conv->getMode() == 'profile' && $conv->getProfileOwner() == DI::userSession()->getLocalUserId()) {
                                return true;
                        }
 
@@ -898,20 +898,20 @@ class Post
        {
                $a = DI::app();
 
-               if (!local_user()) {
+               if (!DI::userSession()->getLocalUserId()) {
                        return '';
                }
 
                $owner = User::getOwnerDataById($a->getLoggedInUserId());
                $item = $this->getData();
 
-               if (!empty($item['content-warning']) && Feature::isEnabled(local_user(), 'add_abstract')) {
+               if (!empty($item['content-warning']) && Feature::isEnabled(DI::userSession()->getLocalUserId(), 'add_abstract')) {
                        $text = '[abstract=' . Protocol::ACTIVITYPUB . ']' . $item['content-warning'] . "[/abstract]\n";
                } else {
                        $text = '';
                }
 
-               if (!Feature::isEnabled(local_user(), 'explicit_mentions')) {
+               if (!Feature::isEnabled(DI::userSession()->getLocalUserId(), 'explicit_mentions')) {
                        return $text;
                }
 
@@ -940,6 +940,7 @@ class Post
         * Get the comment box
         *
         * @param string $indent Indent value
+        *
         * @return mixed The comment box string (empty if no comment box), false on failure
         * @throws \Exception
         * @todo return false is nowhere in this method?
@@ -958,7 +959,7 @@ class Post
                         */
                        $qcomment = null;
                        if (Addon::isEnabled('qcomment')) {
-                               $words = DI::pConfig()->get(local_user(), 'qcomment', 'words');
+                               $words = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'qcomment', 'words');
                                $qcomment = $words ? explode("\n", $words) : [];
                        }
 
@@ -1050,10 +1051,10 @@ class Post
                                                $this->wall_to_wall = true;
 
                                                $owner = [
-                                                       'uid' => 0,
-                                                       'id' => $this->getDataValue('owner-id'),
+                                                       'uid'     => 0,
+                                                       'id'      => $this->getDataValue('owner-id'),
                                                        'network' => $this->getDataValue('owner-network'),
-                                                       'url' => $this->getDataValue('owner-link'),
+                                                       'url'     => $this->getDataValue('owner-link'),
                                                ];
                                                $this->owner_url = Contact::magicLinkByContact($owner);
                                        }