]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Item.php
Merge pull request #5036 from Alkarex/fix-constants
[friendica.git] / src / Model / Item.php
index c16281ae3ea204c5a875e5926936d64e5b9ca55f..01a0b7497cb6397f6762222c2e540d566c021066 100644 (file)
@@ -52,17 +52,24 @@ class Item extends BaseObject
                        return false;
                }
 
+               // To ensure the data integrity we do it in an transaction
+               dba::transaction();
+
+               // We cannot simply expand the condition to check for origin entries
+               // The condition needn't to be a simple array but could be a complex condition.
+               // And we have to execute this query before the update to ensure to fetch the same data.
+               $items = dba::select('item', ['id', 'origin'], $condition);
+
                $success = dba::update('item', $fields, $condition);
 
                if (!$success) {
+                       dba::close($items);
+                       dba::rollback();
                        return false;
                }
 
                $rows = dba::affected_rows();
 
-               // We cannot simply expand the condition to check for origin entries
-               // The condition needn't to be a simple array but could be a complex condition.
-               $items = dba::select('item', ['id', 'origin'], $condition);
                while ($item = dba::fetch($items)) {
                        Term::insertFromTagFieldByItemId($item['id']);
                        Term::insertFromFileFieldByItemId($item['id']);
@@ -74,6 +81,8 @@ class Item extends BaseObject
                        }
                }
 
+               dba::close($items);
+               dba::commit();
                return $rows;
        }
 
@@ -479,14 +488,20 @@ class Item extends BaseObject
                // The contact-id should be set before "self::insert" was called - but there seems to be issues sometimes
                $item["contact-id"] = self::contactId($item);
 
-               $item['author-id'] = defaults($item, 'author-id', Contact::getIdForURL($item["author-link"]));
+               $default = ['url' => $item['author-link'], 'name' => $item['author-name'],
+                       'photo' => $item['author-avatar'], 'network' => $item['network']];
+
+               $item['author-id'] = defaults($item, 'author-id', Contact::getIdForURL($item["author-link"], 0, false, $default));
 
                if (Contact::isBlocked($item["author-id"])) {
                        logger('Contact '.$item["author-id"].' is blocked, item '.$item["uri"].' will not be stored');
                        return 0;
                }
 
-               $item['owner-id'] = defaults($item, 'owner-id', Contact::getIdForURL($item["owner-link"]));
+               $default = ['url' => $item['owner-link'], 'name' => $item['owner-name'],
+                       'photo' => $item['owner-avatar'], 'network' => $item['network']];
+
+               $item['owner-id'] = defaults($item, 'owner-id', Contact::getIdForURL($item["owner-link"], 0, false, $default));
 
                if (Contact::isBlocked($item["owner-id"])) {
                        logger('Contact '.$item["owner-id"].' is blocked, item '.$item["uri"].' will not be stored');
@@ -862,12 +877,32 @@ class Item extends BaseObject
                }
 
                unset($item['id']);
+               unset($item['parent']);
+               unset($item['mention']);
+               unset($item['wall']);
+               unset($item['origin']);
+               unset($item['starred']);
+               unset($item['rendered-hash']);
+               unset($item['rendered-html']);
 
-               $condition = ["`nurl` IN (SELECT `nurl` FROM `contact` WHERE `id` = ?) AND `uid` != 0 AND NOT `blocked` AND NOT `readonly` AND `rel` IN (?, ?)",
+               $users = [];
+
+               $condition = ["`nurl` IN (SELECT `nurl` FROM `contact` WHERE `id` = ?) AND `uid` != 0 AND NOT `blocked` AND `rel` IN (?, ?)",
                        $parent['owner-id'], CONTACT_IS_SHARING,  CONTACT_IS_FRIEND];
                $contacts = dba::select('contact', ['uid'], $condition);
                while ($contact = dba::fetch($contacts)) {
-                       self::storeForUser($itemid, $item, $contact['uid']);
+                       $users[$contact['uid']] = $contact['uid'];
+               }
+
+               if ($item['uri'] != $item['parent-uri']) {
+                       $parents = dba::select('item', ['uid'], ["`uri` = ? AND `uid` != 0", $item['parent-uri']]);
+                       while ($parent = dba::fetch($parents)) {
+                               $users[$parent['uid']] = $parent['uid'];
+                       }
+               }
+
+               foreach ($users as $uid) {
+                       self::storeForUser($itemid, $item, $uid);
                }
        }
 
@@ -905,7 +940,15 @@ class Item extends BaseObject
 
                /// @todo Handling of "event-id"
 
-               $distributed = self::insert($item, false, false, true);
+               $notify = false;
+               if ($item['uri'] == $item['parent-uri']) {
+                       $contact = dba::selectFirst('contact', [], ['id' => $item['contact-id'], 'self' => false]);
+                       if (DBM::is_result($contact)) {
+                               $notify = self::isRemoteSelf($contact, $item);
+                       }
+               }
+
+               $distributed = self::insert($item, false, $notify, true);
 
                if (!$distributed) {
                        logger("Distributed public item " . $itemid . " for user " . $uid . " wasn't stored", LOGGER_DEBUG);
@@ -955,10 +998,15 @@ class Item extends BaseObject
 
                        if (!dba::exists('item', ['uri' => $item['uri'], 'uid' => 0])) {
                                // Preparing public shadow (removing user specific data)
-                               unset($item['id']);
                                $item['uid'] = 0;
-                               $item['origin'] = 0;
-                               $item['wall'] = 0;
+                               unset($item['id']);
+                               unset($item['parent']);
+                               unset($item['wall']);
+                               unset($item['mention']);
+                               unset($item['origin']);
+                               unset($item['starred']);
+                               unset($item['rendered-hash']);
+                               unset($item['rendered-html']);
                                if ($item['uri'] == $item['parent-uri']) {
                                        $item['contact-id'] = Contact::getIdForURL($item['owner-link']);
                                } else {
@@ -1012,11 +1060,20 @@ class Item extends BaseObject
                        return;
                }
 
+               // Save "origin" and "parent" state
+               $origin = $item['origin'];
+               $parent = $item['parent'];
+
                // Preparing public shadow (removing user specific data)
-               unset($item['id']);
                $item['uid'] = 0;
-               $item['origin'] = 0;
-               $item['wall'] = 0;
+               unset($item['id']);
+               unset($item['parent']);
+               unset($item['wall']);
+               unset($item['mention']);
+               unset($item['origin']);
+               unset($item['starred']);
+               unset($item['rendered-hash']);
+               unset($item['rendered-html']);
                $item['contact-id'] = Contact::getIdForURL($item['author-link']);
 
                if (in_array($item['type'], ["net-comment", "wall-comment"])) {
@@ -1028,6 +1085,14 @@ class Item extends BaseObject
                $public_shadow = self::insert($item, false, false, true);
 
                logger("Stored public shadow for comment ".$item['uri']." under id ".$public_shadow, LOGGER_DEBUG);
+
+               // If this was a comment to a Diaspora post we don't get our comment back.
+               // This means that we have to distribute the comment by ourselves.
+               if ($origin) {
+                       if (dba::exists('item', ['id' => $parent, 'network' => NETWORK_DIASPORA])) {
+                               self::distribute($public_shadow);
+                       }
+               }
        }
 
         /**
@@ -1364,20 +1429,24 @@ class Item extends BaseObject
 
                // Prevent the forwarding of posts that are forwarded
                if ($datarray["extid"] == NETWORK_DFRN) {
+                       logger('Already forwarded', LOGGER_DEBUG);
                        return false;
                }
 
                // Prevent to forward already forwarded posts
                if ($datarray["app"] == $a->get_hostname()) {
+                       logger('Already forwarded (second test)', LOGGER_DEBUG);
                        return false;
                }
 
                // Only forward posts
                if ($datarray["verb"] != ACTIVITY_POST) {
+                       logger('No post', LOGGER_DEBUG);
                        return false;
                }
 
                if (($contact['network'] != NETWORK_FEED) && $datarray['private']) {
+                       logger('Not public', LOGGER_DEBUG);
                        return false;
                }
 
@@ -1399,6 +1468,10 @@ class Item extends BaseObject
 
                                unset($datarray['created']);
                                unset($datarray['edited']);
+
+                               unset($datarray['network']);
+                               unset($datarray['owner-id']);
+                               unset($datarray['author-id']);
                        }
 
                        if ($contact['network'] != NETWORK_FEED) {
@@ -1406,7 +1479,8 @@ class Item extends BaseObject
                                unset($datarray["plink"]);
                                $datarray["uri"] = item_new_uri($a->get_hostname(), $contact['uid'], $datarray["guid"]);
                                $datarray["parent-uri"] = $datarray["uri"];
-                               $datarray["extid"] = $contact['network'];
+                               $datarray["thr-parent"] = $datarray["uri"];
+                               $datarray["extid"] = NETWORK_DFRN;
                                $urlpart = parse_url($datarray2['author-link']);
                                $datarray["app"] = $urlpart["host"];
                        } else {
@@ -1416,10 +1490,11 @@ class Item extends BaseObject
 
                if ($contact['network'] != NETWORK_FEED) {
                        // Store the original post
-                       $r = self::insert($datarray2, false, false);
-                       logger('remote-self post original item - Contact '.$contact['url'].' return '.$r.' Item '.print_r($datarray2, true), LOGGER_DEBUG);
+                       $result = self::insert($datarray2, false, false);
+                       logger('remote-self post original item - Contact '.$contact['url'].' return '.$result.' Item '.print_r($datarray2, true), LOGGER_DEBUG);
                } else {
                        $datarray["app"] = "Feed";
+                       $result = true;
                }
 
                // Trigger automatic reactions for addons
@@ -1429,7 +1504,7 @@ class Item extends BaseObject
                $_SESSION["authenticated"] = true;
                $_SESSION["uid"] = $contact['uid'];
 
-               return true;
+               return $result;
        }
 
        /**
@@ -1948,7 +2023,7 @@ EOT;
        {
                $fields = ['uid', 'guid', 'title', 'body', 'created', 'edited', 'commented', 'received', 'changed',
                        'wall', 'private', 'pubmail', 'moderated', 'visible', 'spam', 'starred', 'bookmark', 'contact-id',
-                       'deleted', 'origin', 'forum_mode', 'network', 'rendered-html', 'rendered-hash'];
+                       'deleted', 'origin', 'forum_mode', 'network', 'author-id', 'owner-id', 'rendered-html', 'rendered-hash'];
                $condition = ["`id` = ? AND (`parent` = ? OR `parent` = 0)", $itemid, $itemid];
 
                $item = dba::selectFirst('item', $fields, $condition);
@@ -1972,7 +2047,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]);