]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Item.php
Preparation for new deletion functionality
[friendica.git] / src / Model / Item.php
index 44275ae44c3ac24b20be43e04e17b6a1b3da6609..ea866152bb46126cc5f5b8a87da256b1ec7498bd 100644 (file)
@@ -75,8 +75,9 @@ class Item extends BaseObject
                        Term::insertFromFileFieldByItemId($item['id']);
                        self::updateThread($item['id']);
 
-                       // We only need to notfiy others when it is an original entry from us
-                       if ($item['origin']) {
+                       // We only need to notfiy others when it is an original entry from us.
+                       // Only call the notifier when the item has some content relevant change.
+                       if ($item['origin'] && in_array('edited', array_keys($fields))) {
                                Worker::add(PRIORITY_HIGH, "Notifier", 'edit_post', $item['id']);
                        }
                }
@@ -91,12 +92,13 @@ class Item extends BaseObject
         *
         * @param array $condition The condition for finding the item entries
         * @param integer $priority Priority for the notification
+        * @param integer $uid User who wants to delete the item
         */
-       public static function delete($condition, $priority = PRIORITY_HIGH)
+       public static function delete($condition, $priority = PRIORITY_HIGH, $uid = 0)
        {
                $items = dba::select('item', ['id'], $condition);
                while ($item = dba::fetch($items)) {
-                       self::deleteById($item['id'], $priority);
+                       self::deleteById($item['id'], $priority, $uid);
                }
                dba::close($items);
        }
@@ -106,21 +108,24 @@ class Item extends BaseObject
         *
         * @param integer $item_id Item ID that should be delete
         * @param integer $priority Priority for the notification
+        * @param integer $uid User who wants to delete the item
         *
         * @return boolean success
         */
-       public static function deleteById($item_id, $priority = PRIORITY_HIGH)
+       public static function deleteById($item_id, $priority = PRIORITY_HIGH, $uid = 0)
        {
                // locate item to be deleted
-               $fields = ['id', 'uid', 'parent', 'parent-uri', 'origin', 'deleted',
-                       'file', 'resource-id', 'event-id', 'attach',
+               $fields = ['id', 'uri', 'uid', 'parent', 'parent-uri', 'origin',
+                       'deleted', 'file', 'resource-id', 'event-id', 'attach',
                        'verb', 'object-type', 'object', 'target', 'contact-id'];
                $item = dba::selectFirst('item', $fields, ['id' => $item_id]);
                if (!DBM::is_result($item)) {
+                       logger('Item with ID ' . $item_id . " hasn't been found.", LOGGER_DEBUG);
                        return false;
                }
 
                if ($item['deleted']) {
+                       logger('Item with ID ' . $item_id . ' has already been deleted.', LOGGER_DEBUG);
                        return false;
                }
 
@@ -129,7 +134,11 @@ class Item extends BaseObject
                        $parent = ['origin' => false];
                }
 
-               logger('delete item: ' . $item['id'], LOGGER_DEBUG);
+               // "Deleting" global items just means hiding them
+               if (($item['uid'] == 0) && ($uid != 0)) {
+                       dba::update('user-item', ['hidden' => true], ['iid' => $item_id, 'uid' => $uid], true);
+                       return true;
+               }
 
                // clean up categories and tags so they don't end up as orphans
 
@@ -183,16 +192,34 @@ class Item extends BaseObject
                Term::insertFromFileFieldByItemId($item['id']);
                self::deleteThread($item['id'], $item['parent-uri']);
 
+               if (!dba::exists('item', ["`uri` = ? AND `uid` != 0 AND NOT `deleted`", $item['uri']])) {
+                       self::delete(['uri' => $item['uri'], 'uid' => 0, 'deleted' => false], $priority);
+               }
+
                // If it's the parent of a comment thread, kill all the kids
                if ($item['id'] == $item['parent']) {
-                       self::delete(['parent' => $item['parent']], $priority);
+                       self::delete(['parent' => $item['parent'], 'deleted' => false], $priority);
                }
 
-               // send the notification upstream/downstream
+               // Is it our comment and/or our thread?
                if ($item['origin'] || $parent['origin']) {
+
+                       // When we delete the original post we will delete all existing copies on the server as well
+                       self::delete(['uri' => $item['uri'], 'deleted' => false], $priority);
+
+                       // send the notification upstream/downstream
                        Worker::add(['priority' => $priority, 'dont_fork' => true], "Notifier", "drop", intval($item['id']));
+               } elseif ($item['uid'] != 0) {
+
+                       // When we delete just our local user copy of an item, we have to set a marker to hide it
+                       $global_item = dba::selectFirst('item', ['id'], ['uri' => $item['uri'], 'uid' => 0, 'deleted' => false]);
+                       if (DBM::is_result($global_item)) {
+                               dba::update('user-item', ['hidden' => true], ['iid' => $global_item['id'], 'uid' => $item['uid']], true);
+                       }
                }
 
+               logger('Item with ID ' . $item_id . " has been deleted.", LOGGER_DEBUG);
+
                return true;
        }
 
@@ -333,6 +360,12 @@ class Item extends BaseObject
                        $item['origin'] = 1;
                        $item['network'] = NETWORK_DFRN;
                        $item['protocol'] = PROTOCOL_DFRN;
+
+                       if (is_int($notify)) {
+                               $priority = $notify;
+                       } else {
+                               $priority = PRIORITY_HIGH;
+                       }
                } else {
                        $item['network'] = trim(defaults($item, 'network', NETWORK_PHANTOM));
                }
@@ -355,6 +388,13 @@ class Item extends BaseObject
                        unset($item['dsprsig']);
                }
 
+               if (!empty($item['diaspora_signed_text'])) {
+                       $diaspora_signed_text = $item['diaspora_signed_text'];
+                       unset($item['diaspora_signed_text']);
+               } else {
+                       $diaspora_signed_text = '';
+               }
+
                // Converting the plink
                /// @TODO Check if this is really still needed
                if ($item['network'] == NETWORK_OSTATUS) {
@@ -489,7 +529,7 @@ class Item extends BaseObject
                $item["contact-id"] = self::contactId($item);
 
                $default = ['url' => $item['author-link'], 'name' => $item['author-name'],
-                       'avatar' => $item['author-avatar'], 'network' => $item['network']];
+                       'photo' => $item['author-avatar'], 'network' => $item['network']];
 
                $item['author-id'] = defaults($item, 'author-id', Contact::getIdForURL($item["author-link"], 0, false, $default));
 
@@ -499,7 +539,7 @@ class Item extends BaseObject
                }
 
                $default = ['url' => $item['owner-link'], 'name' => $item['owner-name'],
-                       'avatar' => $item['owner-avatar'], 'network' => $item['network']];
+                       'photo' => $item['owner-avatar'], 'network' => $item['network']];
 
                $item['owner-id'] = defaults($item, 'owner-id', Contact::getIdForURL($item["owner-link"], 0, false, $default));
 
@@ -553,7 +593,7 @@ class Item extends BaseObject
 
                        $fields = ['uri', 'parent-uri', 'id', 'deleted',
                                'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
-                               'wall', 'private', 'forum_mode'];
+                               'wall', 'private', 'forum_mode', 'origin'];
                        $condition = ['uri' => $item['parent-uri'], 'uid' => $item['uid']];
                        $params = ['order' => ['id' => false]];
                        $parent = dba::selectFirst('item', $fields, $condition, $params);
@@ -805,6 +845,12 @@ class Item extends BaseObject
                                                'signature' => $dsprsig->signature, 'signer' => $dsprsig->signer]);
                }
 
+               if (!empty($diaspora_signed_text)) {
+                       // Formerly we stored the signed text, the signature and the author in different fields.
+                       // We now store the raw data so that we are more flexible.
+                       dba::insert('sign', ['iid' => $current_post, 'signed_text' => $diaspora_signed_text]);
+               }
+
                $deleted = self::tagDeliver($item['uid'], $current_post);
 
                /*
@@ -848,7 +894,9 @@ class Item extends BaseObject
                check_user_notification($current_post);
 
                if ($notify) {
-                       Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => true], "Notifier", $notify_type, $current_post);
+                       Worker::add(['priority' => $priority, 'dont_fork' => true], "Notifier", $notify_type, $current_post);
+               } elseif (!empty($parent) && $parent['origin']) {
+                       Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => true], "Notifier", "comment-import", $current_post);
                }
 
                return $current_post;
@@ -857,9 +905,10 @@ class Item extends BaseObject
        /**
         * @brief Distributes public items to the receivers
         *
-        * @param integer $itemid Item ID that should be added
+        * @param integer $itemid      Item ID that should be added
+        * @param string  $signed_text Original text (for Diaspora signatures), JSON encoded.
         */
-       public static function distribute($itemid)
+       public static function distribute($itemid, $signed_text = '')
        {
                $condition = ["`id` IN (SELECT `parent` FROM `item` WHERE `id` = ?)", $itemid];
                $parent = dba::selectFirst('item', ['owner-id'], $condition);
@@ -894,14 +943,22 @@ class Item extends BaseObject
                        $users[$contact['uid']] = $contact['uid'];
                }
 
+               $origin_uid = 0;
+
                if ($item['uri'] != $item['parent-uri']) {
-                       $parents = dba::select('item', ['uid'], ["`uri` = ? AND `uid` != 0", $item['parent-uri']]);
+                       $parents = dba::select('item', ['uid', 'origin'], ["`uri` = ? AND `uid` != 0", $item['parent-uri']]);
                        while ($parent = dba::fetch($parents)) {
                                $users[$parent['uid']] = $parent['uid'];
+                               if ($parent['origin'] && !$item['origin']) {
+                                       $origin_uid = $parent['uid'];
+                               }
                        }
                }
 
                foreach ($users as $uid) {
+                       if ($origin_uid == $uid) {
+                               $item['diaspora_signed_text'] = $signed_text;
+                       }
                        self::storeForUser($itemid, $item, $uid);
                }
        }
@@ -1208,7 +1265,7 @@ class Item extends BaseObject
                }
        }
 
-       private static function setHashtags(&$item)
+       public static function setHashtags(&$item)
        {
 
                $tags = get_tags($item["body"]);
@@ -2047,7 +2104,7 @@ EOT;
 
                $result = dba::update('thread', $fields, ['iid' => $itemid]);
 
-               logger("Update thread for item ".$itemid." - guid ".$item["guid"]." - ".(int)$result." ".print_r($item, true), LOGGER_DEBUG);
+               logger("Update thread for item ".$itemid." - guid ".$item["guid"]." - ".(int)$result, LOGGER_DEBUG);
 
                // Updating a shadow item entry
                $items = dba::selectFirst('item', ['id'], ['guid' => $item['guid'], 'uid' => 0]);