diff --git a/include/items.php b/include/items.php index 4a76cb9090..cbd3883db2 100644 --- a/include/items.php +++ b/include/items.php @@ -14,6 +14,7 @@ use Friendica\Model\GContact; use Friendica\Model\Group; use Friendica\Model\Term; use Friendica\Model\User; +use Friendica\Model\Item; use Friendica\Object\Image; use Friendica\Protocol\DFRN; use Friendica\Protocol\OStatus; @@ -1124,9 +1125,9 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f } if ($arr['parent-uri'] === $arr['uri']) { - add_shadow_thread($current_post); + Item::addShadow($current_post); } else { - add_shadow_entry($current_post); + Item::addShadowPost($current_post); } check_user_notification($current_post); diff --git a/include/threads.php b/include/threads.php index 7c20018259..61bc5292ff 100644 --- a/include/threads.php +++ b/include/threads.php @@ -1,9 +1,6 @@ 'created']); - - logger("fetched messages: ".dba::num_rows($messages)); - while ($message = dba::fetch($messages)) - add_shadow_thread($message["iid"]); - - dba::close($messages); -} diff --git a/src/Model/Item.php b/src/Model/Item.php index 2ad610ccac..19225beab5 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -8,6 +8,8 @@ namespace Friendica\Model; use Friendica\Core\Worker; use Friendica\Model\Term; +use Friendica\Model\Contact; +use Friendica\Database\DBM; use dba; require_once 'include/tags.php'; @@ -60,4 +62,141 @@ class Item return $rows; } + + /** + * @brief Add a shadow entry for a given item id that is a thread starter + * + * We store every public item entry additionally with the user id "0". + * This is used for the community page and for the search. + * It is planned that in the future we will store public item entries only once. + * + * @param integer $itemid Item ID that should be added + */ + public static function addShadow($itemid) { + $fields = ['uid', 'wall', 'private', 'moderated', 'visible', 'contact-id', 'deleted', 'network', 'author-id', 'owner-id']; + $condition = ["`id` = ? AND (`parent` = ? OR `parent` = 0)", $itemid, $itemid]; + $item = dba::selectFirst('item', $fields, $condition); + + if (!DBM::is_result($item)) { + return; + } + + // is it already a copy? + if (($itemid == 0) || ($item['uid'] == 0)) { + return; + } + + // Is it a visible public post? + if (!$item["visible"] || $item["deleted"] || $item["moderated"] || $item["private"]) { + return; + } + + // is it an entry from a connector? Only add an entry for natively connected networks + if (!in_array($item["network"], [NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""])) { + return; + } + + // Is the public contact configured as hidden? + if (Contact::isHidden($item["owner-id"]) || Contact::isHidden($item["author-id"])) { + return; + } + + // Only do these checks if the post isn't a wall post + if (!$item["wall"]) { + // Check, if hide-friends is activated - then don't do a shadow entry + if (dba::exists('profile', ['is-default' => true, 'uid' => $item['uid'], 'hide-friends' => true])) { + return; + } + + // Check if the contact is hidden or blocked + if (!dba::exists('contact', ['hidden' => false, 'blocked' => false, 'id' => $item['contact-id']])) { + return; + } + } + + // Only add a shadow, if the profile isn't hidden + if (dba::exists('user', ['uid' => $item['uid'], 'hidewall' => true])) { + return; + } + + $item = dba::selectFirst('item', [], ['id' => $itemid]); + + if (count($item) && ($item["allow_cid"] == '') && ($item["allow_gid"] == '') && + ($item["deny_cid"] == '') && ($item["deny_gid"] == '')) { + + if (!dba::exists('item', ['uri' => $item['uri'], 'uid' => 0])) { + // Preparing public shadow (removing user specific data) + require_once("include/items.php"); + + unset($item['id']); + $item['uid'] = 0; + $item['origin'] = 0; + $item['wall'] = 0; + $item['contact-id'] = Contact::getIdForURL($item['author-link'], 0); + + if (in_array($item['type'], ["net-comment", "wall-comment"])) { + $item['type'] = 'remote-comment'; + } elseif ($item['type'] == 'wall') { + $item['type'] = 'remote'; + } + + $public_shadow = item_store($item, false, false, true); + + logger("Stored public shadow for thread ".$itemid." under id ".$public_shadow, LOGGER_DEBUG); + } + } + } + + /** + * @brief Add a shadow entry for a given item id that is a comment + * + * This function does the same like the function above - but for comments + * + * @param integer $itemid Item ID that should be added + */ + public static function addShadowPost($itemid) { + $item = dba::selectFirst('item', [], ['id' => $itemid]); + if (!DBM::is_result($item)) { + return; + } + + // Is it a toplevel post? + if ($item['id'] == $item['parent']) { + self::addShadow($itemid); + return; + } + + // Is this a shadow entry? + if ($item['uid'] == 0) + return; + + // Is there a shadow parent? + if (!dba::exists('item', ['uri' => $item['parent-uri'], 'uid' => 0])) { + return; + } + + // Is there already a shadow entry? + if (dba::exists('item', ['uri' => $item['uri'], 'uid' => 0])) { + return; + } + + // Preparing public shadow (removing user specific data) + require_once("include/items.php"); + + unset($item['id']); + $item['uid'] = 0; + $item['origin'] = 0; + $item['wall'] = 0; + $item['contact-id'] = Contact::getIdForURL($item['author-link'], 0); + + if (in_array($item['type'], ["net-comment", "wall-comment"])) { + $item['type'] = 'remote-comment'; + } elseif ($item['type'] == 'wall') { + $item['type'] = 'remote'; + } + + $public_shadow = item_store($item, false, false, true); + + logger("Stored public shadow for comment ".$item['uri']." under id ".$public_shadow, LOGGER_DEBUG); + } } diff --git a/src/Worker/CreateShadowEntry.php b/src/Worker/CreateShadowEntry.php index cf95ec622c..97f526a219 100644 --- a/src/Worker/CreateShadowEntry.php +++ b/src/Worker/CreateShadowEntry.php @@ -8,7 +8,7 @@ namespace Friendica\Worker; -require_once("include/threads.php"); +use Friendica\Model\Item; class CreateShadowEntry { public static function execute($message_id = 0) { @@ -16,6 +16,6 @@ class CreateShadowEntry { return; } - add_shadow_entry($message_id); + Item::addShadowPost($message_id); } } diff --git a/src/Worker/ThreadUpdate.php b/src/Worker/ThreadUpdate.php deleted file mode 100644 index 30af76399f..0000000000 --- a/src/Worker/ThreadUpdate.php +++ /dev/null @@ -1,11 +0,0 @@ -