diff --git a/src/Database/DBStructure.php b/src/Database/DBStructure.php index 6ad6bb527..3aedc435f 100644 --- a/src/Database/DBStructure.php +++ b/src/Database/DBStructure.php @@ -1232,7 +1232,7 @@ class DBStructure } elseif ($verbose) { echo "Zero permissionset already added\n"; } - if (!self::existsForeignKeyForField('item', 'psid')) { + if (self::existsTable('item') && !self::existsForeignKeyForField('item', 'psid')) { $sets = DBA::p("SELECT `psid`, `item`.`uid`, `item`.`private` FROM `item` LEFT JOIN `permissionset` ON `permissionset`.`id` = `item`.`psid` WHERE `permissionset`.`id` IS NULL AND NOT `psid` IS NULL"); diff --git a/src/Database/PostUpdate.php b/src/Database/PostUpdate.php index 3a1333780..a58281e48 100644 --- a/src/Database/PostUpdate.php +++ b/src/Database/PostUpdate.php @@ -179,6 +179,11 @@ class PostUpdate return true; } + if (!DBStructure::existsTable('item')) { + DI::config()->set('system', 'post_update_version', 1329); + return true; + } + $id = DI::config()->get('system', 'post_update_version_1329_id', 0); Logger::info('Start', ['item' => $id]); @@ -514,7 +519,7 @@ class PostUpdate return true; } - if (!DBStructure::existsTable('item-activity')) { + if (!DBStructure::existsTable('item-activity') || !DBStructure::existsTable('item')) { DI::config()->set('system', 'post_update_version', 1347); return true; } diff --git a/src/Model/Item.php b/src/Model/Item.php index 28e0e25f4..8d2eefe0a 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -1031,14 +1031,14 @@ class Item return 0; } - $id = Post\User::insert($item['uri-id'], $item['uid'], $item); - if (!$id) { + $post_user_id = Post\User::insert($item['uri-id'], $item['uid'], $item); + if (!$post_user_id) { Logger::notice('Post-User is already inserted - aborting', ['uid' => $item['uid'], 'uri-id' => $item['uri-id']]); return 0; } if ($item['gravity'] == GRAVITY_PARENT) { - $item['post-user-id'] = $id; + $item['post-user-id'] = $post_user_id; Post\ThreadUser::insert($item['uri-id'], $item['uid'], $item); } @@ -1071,82 +1071,78 @@ class Item // Set parent id DBA::update('item', ['parent' => $parent_id], ['id' => $current_post]); - $item['id'] = $current_post; - $item['parent'] = $parent_id; + $posted_item = Post::selectFirst(self::ITEM_FIELDLIST, ['post-user-id' => $post_user_id]); + if (!DBA::isResult($posted_item)) { + Logger::warning('new item not found in DB', ['id' => $post_user_id]); + return 0; + } // update the commented timestamp on the parent if (DI::config()->get('system', 'like_no_comment')) { // Update when it is a comment - $update_commented = in_array($item['gravity'], [GRAVITY_PARENT, GRAVITY_COMMENT]); + $update_commented = in_array($posted_item['gravity'], [GRAVITY_PARENT, GRAVITY_COMMENT]); } else { // Update when it isn't a follow or tag verb - $update_commented = !in_array($item['verb'], [Activity::FOLLOW, Activity::TAG]); + $update_commented = !in_array($posted_item['verb'], [Activity::FOLLOW, Activity::TAG]); } if ($update_commented) { - Post::update(['commented' => DateTimeFormat::utcNow(), 'changed' => DateTimeFormat::utcNow()], ['id' => $parent_id]); + Post::update(['commented' => DateTimeFormat::utcNow(), 'changed' => DateTimeFormat::utcNow()], ['id' => $post_user_id]); } else { - Post::update(['changed' => DateTimeFormat::utcNow()], ['id' => $parent_id]); + Post::update(['changed' => DateTimeFormat::utcNow()], ['uri-id' => $posted_item['parent-uri-id'], 'uid' => $posted_item['uid']]); } // In that function we check if this is a forum post. Additionally we delete the item under certain circumstances - if (self::tagDeliver($item['uid'], $current_post)) { + if (self::tagDeliver($posted_item['uid'], $post_user_id)) { // Get the user information for the logging $user = User::getById($uid); - Logger::notice('Item had been deleted', ['id' => $current_post, 'user' => $uid, 'account-type' => $user['account-type']]); + Logger::notice('Item had been deleted', ['id' => $post_user_id, 'user' => $uid, 'account-type' => $user['account-type']]); return 0; } if (!$dontcache) { - $posted_item = Post::selectFirst(self::ITEM_FIELDLIST, ['id' => $current_post]); - if (DBA::isResult($posted_item)) { - if ($notify) { - Hook::callAll('post_local_end', $posted_item); - } else { - Hook::callAll('post_remote_end', $posted_item); - } + if ($notify) { + Hook::callAll('post_local_end', $posted_item); } else { - Logger::log('new item not found in DB, id ' . $current_post); - } + Hook::callAll('post_remote_end', $posted_item); + } } - if ($item['gravity'] === GRAVITY_PARENT) { - self::addShadow($current_post); + if ($posted_item['gravity'] === GRAVITY_PARENT) { + self::addShadow($post_user_id); } else { - self::addShadowPost($current_post); + self::addShadowPost($post_user_id); } - self::updateContact($item); + self::updateContact($posted_item); - Post\UserNotification::setNotification($item['uri-id'], $item['uid']); + Post\UserNotification::setNotification($posted_item['uri-id'], $posted_item['uid']); - check_user_notification($item['uri-id'], $item['uid']); - //check_user_notification($current_post); + check_user_notification($posted_item['uri-id'], $posted_item['uid']); // Distribute items to users who subscribed to their tags - self::distributeByTags($item); + self::distributeByTags($posted_item); // Automatically reshare the item if the "remote_self" option is selected - self::autoReshare($item); + self::autoReshare($posted_item); - $transmit = $notify || ($item['visible'] && ($parent_origin || $item['origin'])); + $transmit = $notify || ($posted_item['visible'] && ($parent_origin || $posted_item['origin'])); if ($transmit) { - $transmit_item = Post::selectFirst(['verb', 'origin'], ['id' => $item['id']]); // Don't relay participation messages - if (($transmit_item['verb'] == Activity::FOLLOW) && - (!$transmit_item['origin'] || ($item['author-id'] != Contact::getPublicIdByUserId($uid)))) { - Logger::info('Participation messages will not be relayed', ['item' => $item['id'], 'uri' => $item['uri'], 'verb' => $transmit_item['verb']]); + if (($posted_item['verb'] == Activity::FOLLOW) && + (!$posted_item['origin'] || ($posted_item['author-id'] != Contact::getPublicIdByUserId($uid)))) { + Logger::info('Participation messages will not be relayed', ['item' => $posted_item['id'], 'uri' => $posted_item['uri'], 'verb' => $posted_item['verb']]); $transmit = false; } } if ($transmit) { - Worker::add(['priority' => $priority, 'dont_fork' => true], 'Notifier', $notify_type, (int)$item['uri-id'], (int)$item['uid']); + Worker::add(['priority' => $priority, 'dont_fork' => true], 'Notifier', $notify_type, (int)$posted_item['uri-id'], (int)$posted_item['uid']); } - return $current_post; + return $post_user_id; } /** @@ -1235,6 +1231,7 @@ class Item $condition = ["`id` IN (SELECT `parent` FROM `post-view` WHERE `id` = ?)", $itemid]; $parent = Post::selectFirst(['owner-id'], $condition); if (!DBA::isResult($parent)) { + Logger::warning('Item not found', ['condition' => $condition]); return; } @@ -1244,6 +1241,7 @@ class Item 'visible' => true, 'deleted' => false, 'private' => [self::PUBLIC, self::UNLISTED]]; $item = Post::selectFirst(self::ITEM_FIELDLIST, $condition); if (!DBA::isResult($item)) { + Logger::warning('Item not found', ['condition' => $condition]); return; } @@ -1421,7 +1419,7 @@ class Item private static function addShadow($itemid) { $fields = ['uid', 'private', 'visible', 'deleted', 'network', 'uri-id']; - $condition = ['id' => $itemid, 'parent' => [0, $itemid]]; + $condition = ['id' => $itemid, 'gravity' => GRAVITY_PARENT]; $item = Post::selectFirst($fields, $condition); if (!DBA::isResult($item)) { @@ -1816,7 +1814,7 @@ class Item if (!$mention) { if (($community_page || $prvgroup) && !$item['wall'] && !$item['origin'] && ($item['gravity'] == GRAVITY_PARENT)) { - Logger::info('Delete private group/communiy top-level item without mention', ['id' => $item_id, 'guid'=> $item['guid']]); + Logger::info('Delete private group/communiy top-level item without mention', ['id' => $item['id'], 'guid'=> $item['guid']]); DBA::delete('item', ['uri-id' => $item['uri-id'], 'uid' => $item['uid']]); Post\User::delete(['uri-id' => $item['uri-id'], 'uid' => $item['uid']]); return true; @@ -1865,11 +1863,11 @@ class Item $fields = ['wall' => true, 'origin' => true, 'forum_mode' => $forum_mode, 'contact-id' => $self['id'], 'owner-id' => $owner_id, 'private' => $private, 'psid' => $psid]; - self::update($fields, ['id' => $item_id]); + self::update($fields, ['id' => $item['id']]); Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => true], 'Notifier', Delivery::POST, (int)$item['uri-id'], (int)$item['uid']); - self::performActivity($item_id, 'announce', $uid); + self::performActivity($item['id'], 'announce', $uid); return false; } diff --git a/src/Worker/APDelivery.php b/src/Worker/APDelivery.php index 099fdc397..99ea6f832 100644 --- a/src/Worker/APDelivery.php +++ b/src/Worker/APDelivery.php @@ -55,9 +55,10 @@ class APDelivery } if (empty($uri_id) && !empty($item_id)) { - $item = Post::selectFirst(['uri-id'], ['id' => $item_id]); + $item = Post::selectFirst(['uri-id', 'id'], ['item-id' => $item_id]); if (!empty($item['uri-id'])) { $uri_id = $item['uri-id']; + $item_id = $item['id']; } } elseif (!empty($uri_id) && !empty($item_id)) { $item = Post::selectFirst(['id'], ['uri-id' => $uri_id, 'uid' => $uid]); diff --git a/src/Worker/Delivery.php b/src/Worker/Delivery.php index faba263e9..e2db058ea 100644 --- a/src/Worker/Delivery.php +++ b/src/Worker/Delivery.php @@ -62,6 +62,13 @@ class Delivery return; } $target_id = $post['id']; + } elseif (!in_array($cmd, [Delivery::MAIL, Delivery::SUGGESTION, Delivery::REMOVAL, Delivery::RELOCATION])) { + $post = Post::selectFirst(['id', 'uid', 'uri-id'], ['item-id' => $post_uriid]); + if (DBA::isResult($post)) { + $target_id = $post['id']; + $sender_uid = $post['uid']; + $post_uriid = $post['uri-id']; + } } else { $target_id = $post_uriid; } diff --git a/src/Worker/Expire.php b/src/Worker/Expire.php index 31c0af039..ba984bb21 100644 --- a/src/Worker/Expire.php +++ b/src/Worker/Expire.php @@ -44,10 +44,10 @@ class Expire Logger::log('Delete expired items', Logger::DEBUG); // physically remove anything that has been deleted for more than two months $condition = ["`deleted` AND `changed` < UTC_TIMESTAMP() - INTERVAL 60 DAY"]; - $rows = Post::select(['id', 'guid', 'uri-id', 'uid'], $condition); + $rows = Post::select(['item-id', 'guid', 'uri-id', 'uid'], $condition); while ($row = Post::fetch($rows)) { - Logger::info('Delete expired item', ['id' => $row['id'], 'guid' => $row['guid']]); - DBA::delete('item', ['id' => $row['id']]); + Logger::info('Delete expired item', ['id' => $row['item-id'], 'guid' => $row['guid']]); + DBA::delete('item', ['id' => $row['item-id']]); Post\User::delete(['uri-id' => $row['uri-id'], 'uid' => $row['uid']]); Post\ThreadUser::delete(['uri-id' => $row['uri-id'], 'uid' => $row['uid']]); } diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index 836e4c680..f225adf11 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -66,6 +66,14 @@ class Notifier return; } $target_id = $post['id']; + } elseif (!in_array($cmd, [Delivery::MAIL, Delivery::SUGGESTION, Delivery::REMOVAL, Delivery::RELOCATION])) { + $post = Post::selectFirst(['id'], ['item-id' => $post_uriid]); + $post = Post::selectFirst(['id', 'uid', 'uri-id'], ['item-id' => $post_uriid]); + if (DBA::isResult($post)) { + $target_id = $post['id']; + $sender_uid = $post['uid']; + $post_uriid = $post['uri-id']; + } } else { $target_id = $post_uriid; } diff --git a/src/Worker/RemoveContact.php b/src/Worker/RemoveContact.php index 6d48dd956..f038cc5e8 100644 --- a/src/Worker/RemoveContact.php +++ b/src/Worker/RemoveContact.php @@ -47,10 +47,10 @@ class RemoveContact { $condition = ['uid' => $contact['uid'], 'contact-id' => $id]; } do { - $items = Post::select(['id', 'post-user-id', 'uri-id', 'guid'], $condition, ['limit' => 100]); + $items = Post::select(['item-id', 'post-user-id', 'uri-id', 'guid'], $condition, ['limit' => 100]); while ($item = Post::fetch($items)) { - Logger::info('Delete removed contact item', ['id' => $item['id'], 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); - DBA::delete('item', ['id' => $item['id']]); + Logger::info('Delete removed contact item', ['id' => $item['item-id'], 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]); + DBA::delete('item', ['id' => $item['item-id']]); Post::delete(['uri-id' => $item['uri-id']]); Post\ThreadUser::delete(['post-user-id' => $item['post-user-id']]); Post\Thread::delete(['uri-id' => $item['uri-id']]); diff --git a/static/dbview.config.php b/static/dbview.config.php index eba31db6a..79a2407f4 100644 --- a/static/dbview.config.php +++ b/static/dbview.config.php @@ -39,12 +39,11 @@ return [ "post-view" => [ "fields" => [ - "id" => ["item", "id"], + "id" => ["post-user", "id"], "item-id" => ["item", "id"], "post-user-id" => ["post-user", "id"], "uid" => ["post-user", "uid"], - "parent" => ["item", "parent"], - "parent-user-id" => ["parent-post", "id"], + "parent" => ["parent-post", "id"], "uri" => ["item-uri", "uri"], "uri-id" => ["post-user", "uri-id"], "parent-uri" => ["parent-item-uri", "uri"], @@ -196,13 +195,12 @@ ], "post-thread-view" => [ "fields" => [ - "id" => ["item", "id"], + "id" => ["post-user", "id"], "item-id" => ["item", "id"], - "iid" => ["item", "id"], + "iid" => ["post-user", "id"], "post-user-id" => ["post-user", "id"], "uid" => ["post-thread-user", "uid"], - "parent" => ["item", "parent"], - "parent-user-id" => ["parent-post", "id"], + "parent" => ["parent-post", "id"], "uri" => ["item-uri", "uri"], "uri-id" => ["post-thread-user", "uri-id"], "parent-uri" => ["parent-item-uri", "uri"], @@ -381,8 +379,7 @@ "network-item-view" => [ "fields" => [ "uri-id" => ["post-user", "uri-id"], - "parent" => ["item", "parent"], - "parent-uri-id" => ["post-user", "parent-uri-id"], + "parent" => ["post-user", "parent-uri-id"], "received" => ["post-user", "received"], "commented" => ["post-thread-user", "commented"], "created" => ["post-user", "created"], @@ -396,8 +393,7 @@ "contact-type" => ["ownercontact", "contact-type"], ], "query" => "FROM `post-user` - STRAIGHT_JOIN `post-thread-user` ON `post-thread-user`.`uri-id` = `post-user`.`parent-uri-id` AND `post-thread-user`.`uid` = `post-user`.`uid` - LEFT JOIN `item` ON `item`.`uri-id` = `post-user`.`uri-id` AND `item`.`uid` = `post-user`.`uid` + STRAIGHT_JOIN `post-thread-user` ON `post-thread-user`.`uri-id` = `post-user`.`parent-uri-id` AND `post-thread-user`.`uid` = `post-user`.`uid` INNER JOIN `contact` ON `contact`.`id` = `post-thread-user`.`contact-id` LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `post-thread-user`.`uid` AND `author`.`cid` = `post-thread-user`.`author-id` LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `post-thread-user`.`uid` AND `owner`.`cid` = `post-thread-user`.`owner-id` @@ -411,8 +407,7 @@ "network-thread-view" => [ "fields" => [ "uri-id" => ["post-thread-user", "uri-id"], - "parent-uri-id" => ["post-user", "parent-uri-id"], - "parent" => ["item", "id"], + "parent" => ["post-user", "parent-uri-id"], "received" => ["post-thread-user", "received"], "commented" => ["post-thread-user", "commented"], "created" => ["post-thread-user", "created"], @@ -425,7 +420,6 @@ ], "query" => "FROM `post-thread-user` INNER JOIN `post-user` ON `post-user`.`id` = `post-thread-user`.`post-user-id` - LEFT JOIN `item` ON `item`.`uri-id` = `post-thread-user`.`uri-id` AND `item`.`uid` = `post-thread-user`.`uid` STRAIGHT_JOIN `contact` ON `contact`.`id` = `post-thread-user`.`contact-id` LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `post-thread-user`.`uid` AND `author`.`cid` = `post-thread-user`.`author-id` LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `post-thread-user`.`uid` AND `owner`.`cid` = `post-thread-user`.`owner-id`