From c1d99d6c4cefe482c29ad0a8b75b6c8288dec2ce Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 31 Jan 2021 23:37:34 +0000 Subject: [PATCH] Most user-item traces removed --- database.sql | 32 ++++++++++--- include/enotify.php | 5 +-- src/Factory/Api/Mastodon/Status.php | 4 +- src/Model/Item.php | 69 +++-------------------------- src/Model/Post.php | 46 +++++-------------- src/Model/Post/ThreadUser.php | 54 ++++++++++++++++++++++ src/Model/UserItem.php | 5 +-- src/Module/Item/Ignore.php | 22 +++------ src/Module/Item/Pin.php | 16 +++++-- src/Object/Post.php | 20 ++++----- static/dbstructure.config.php | 7 +-- static/dbview.config.php | 8 ++-- update.php | 4 +- 13 files changed, 139 insertions(+), 153 deletions(-) diff --git a/database.sql b/database.sql index 9afb7cb0f..a74d4ea6a 100644 --- a/database.sql +++ b/database.sql @@ -1,6 +1,6 @@ -- ------------------------------------------ -- Friendica 2021.03-dev (Red Hot Poker) --- DB_UPDATE_VERSION 1396 +-- DB_UPDATE_VERSION 1397 -- ------------------------------------------ @@ -684,7 +684,6 @@ CREATE TABLE IF NOT EXISTS `item` ( `guid` varchar(255) NOT NULL DEFAULT '' COMMENT 'A unique identifier for this item', `uri` varchar(255) NOT NULL DEFAULT '' COMMENT '', `uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the item uri', - `uri-hash` varchar(80) NOT NULL DEFAULT '' COMMENT 'RIPEMD-128 hash from uri', `parent` int unsigned COMMENT 'item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item', `parent-uri` varchar(255) NOT NULL DEFAULT '' COMMENT 'uri of the top-level parent to this item', `parent-uri-id` int unsigned COMMENT 'Id of the item-uri table that contains the top-level parent uri', @@ -720,6 +719,7 @@ CREATE TABLE IF NOT EXISTS `item` ( `psid` int unsigned COMMENT 'ID of the permission set of this post', `resource-id` varchar(32) NOT NULL DEFAULT '' COMMENT 'Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type', `event-id` int unsigned COMMENT 'Used to link to the event.id', + `uri-hash` varchar(80) COMMENT 'Deprecated', `iaid` int unsigned COMMENT 'Deprecated', `icid` int unsigned COMMENT 'Deprecated', `attach` mediumtext COMMENT 'Deprecated', @@ -1141,6 +1141,26 @@ CREATE TABLE IF NOT EXISTS `post-tag` ( FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='post relation to tags'; +-- +-- TABLE post-thread-user +-- +CREATE TABLE IF NOT EXISTS `post-thread-user` ( + `uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri', + `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner id which owns this copy of the item', + `pinned` boolean NOT NULL DEFAULT '0' COMMENT 'The thread is pinned on the profile page', + `starred` boolean NOT NULL DEFAULT '0' COMMENT '', + `ignored` boolean NOT NULL DEFAULT '0' COMMENT 'Ignore updates for this thread', + `wall` boolean NOT NULL DEFAULT '0' COMMENT 'This item was posted to the wall of uid', + `pubmail` boolean NOT NULL DEFAULT '0' COMMENT '', + `forum_mode` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '', + PRIMARY KEY(`uid`,`uri-id`), + INDEX `uid_wall` (`uid`,`wall`), + INDEX `uid_pinned` (`uid`,`pinned`), + INDEX `uri-id` (`uri-id`), + FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, + FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE +) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Thread related data per user'; + -- -- TABLE post-user -- @@ -1848,13 +1868,13 @@ CREATE VIEW `network-item-view` AS SELECT FROM `item` INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent` STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` - LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid` + LEFT JOIN `post-user` ON `post-user`.`uri-id` = `item`.`uri-id` AND `post-user`.`uid` = `thread`.`uid` LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id` LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id` LEFT JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `thread`.`owner-id` WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated` AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`) - AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`) + AND (`post-user`.`hidden` IS NULL OR NOT `post-user`.`hidden`) AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`) AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`); @@ -1879,13 +1899,13 @@ CREATE VIEW `network-thread-view` AS SELECT FROM `thread` STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid` - LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid` + LEFT JOIN `post-user` ON `post-user`.`uri-id` = `item`.`uri-id` AND `post-user`.`uid` = `thread`.`uid` LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id` LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id` LEFT JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `thread`.`owner-id` WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated` AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`) - AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`) + AND (`post-user`.`hidden` IS NULL OR NOT `post-user`.`hidden`) AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`) AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`); diff --git a/include/enotify.php b/include/enotify.php index eb5660327..aa5342dcc 100644 --- a/include/enotify.php +++ b/include/enotify.php @@ -149,9 +149,8 @@ function notification($params) } if ($params['type'] == Notification\Type::COMMENT || $params['type'] == Notification\Type::TAG_SELF) { - $thread = Post::selectFirstThreadForUser($params['uid'], ['ignored'], ['iid' => $parent_id, 'deleted' => false]); - if (DBA::isResult($thread) && $thread['ignored']) { - Logger::log('Thread ' . $parent_id . ' will be ignored', Logger::DEBUG); + if (Post\ThreadUser::getIgnored($parent_uri_id, $params['uid'])) { + Logger::info('Thread is ignored', ['parent' => $parent_id, 'parent-uri-id' => $parent_uri_id]); return false; } diff --git a/src/Factory/Api/Mastodon/Status.php b/src/Factory/Api/Mastodon/Status.php index cd611e8ee..6a3212c26 100644 --- a/src/Factory/Api/Mastodon/Status.php +++ b/src/Factory/Api/Mastodon/Status.php @@ -77,9 +77,9 @@ class Status extends BaseFactory $userAttributes = new \Friendica\Object\Api\Mastodon\Status\UserAttributes( Post::exists(['thr-parent-id' => $uriId, 'uid' => $uid, 'origin' => true, 'gravity' => GRAVITY_ACTIVITY, 'vid' => Verb::getID(Activity::LIKE)]), Post::exists(['thr-parent-id' => $uriId, 'uid' => $uid, 'origin' => true, 'gravity' => GRAVITY_ACTIVITY, 'vid' => Verb::getID(Activity::ANNOUNCE)]), - DBA::exists('thread', ['iid' => $item['id'], 'uid' => $item['uid'], 'ignored' => true]), + Post\ThreadUser::getIgnored($uriId, $item['uid']), (bool)$item['starred'], - DBA::exists('user-item', ['iid' => $item['id'], 'uid' => $item['uid'], 'pinned' => true]) + Post\ThreadUser::getPinned($uriId, $item['uid']) ); $sensitive = DBA::exists('tag-view', ['uri-id' => $uriId, 'name' => 'nsfw']); diff --git a/src/Model/Item.php b/src/Model/Item.php index bb371e532..9edafaf5f 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -31,7 +31,6 @@ use Friendica\Core\Session; use Friendica\Core\System; use Friendica\Model\Tag; use Friendica\Core\Worker; -use Friendica\Database\Database; use Friendica\Database\DBA; use Friendica\Database\DBStructure; use Friendica\DI; @@ -133,49 +132,6 @@ class Item const PRIVATE = 1; const UNLISTED = 2; - const TABLES = ['item', 'user-item', 'post-content', 'post-delivery-data', 'diaspora-interaction']; - - private static function getItemFields() - { - $definition = DBStructure::definition('', false); - - $postfields = []; - foreach (self::TABLES as $table) { - $postfields[$table] = array_keys($definition[$table]['fields']); - } - - return $postfields; - } - - /** - * Set the pinned state of an item - * - * @param integer $iid Item ID - * @param integer $uid User ID - * @param boolean $pinned Pinned state - */ - public static function setPinned(int $iid, int $uid, bool $pinned) - { - DBA::update('user-item', ['pinned' => $pinned], ['iid' => $iid, 'uid' => $uid], true); - } - - /** - * Get the pinned state - * - * @param integer $iid Item ID - * @param integer $uid User ID - * - * @return boolean pinned state - */ - public static function getPinned(int $iid, int $uid) - { - $useritem = DBA::selectFirst('user-item', ['pinned'], ['iid' => $iid, 'uid' => $uid]); - if (!DBA::isResult($useritem)) { - return false; - } - return (bool)$useritem['pinned']; - } - /** * Update existing item entries * @@ -285,12 +241,9 @@ class Item Post\User::update($item['uri-id'], $uid, ['hidden' => true], true); } - // "Deleting" global items just means hiding them - if ($item['uid'] == 0) { - DBA::update('user-item', ['hidden' => true], ['iid' => $item['id'], 'uid' => $uid], true); - } elseif ($item['uid'] == $uid) { + if ($item['uid'] == $uid) { self::markForDeletionById($item['id'], PRIORITY_HIGH); - } else { + } elseif ($item['uid'] != 0) { Logger::log('Wrong ownership. Not deleting item ' . $item['id']); } } @@ -393,12 +346,6 @@ class Item } } elseif ($item['uid'] != 0) { Post\User::update($item['uri-id'], $item['uid'], ['hidden' => true]); - - // When we delete just our local user copy of an item, we have to set a marker to hide it - $global_item = Post::selectFirst(['id'], ['uri-id' => $item['uri-id'], 'uid' => 0, 'deleted' => false]); - if (DBA::isResult($global_item)) { - DBA::update('user-item', ['hidden' => true], ['iid' => $global_item['id'], 'uid' => $item['uid']], true); - } } Logger::info('Item has been marked for deletion.', ['id' => $item_id]); @@ -755,8 +702,6 @@ class Item public static function insert($item, $notify = false, $dontcache = false) { - $structure = self::getItemFields(); - $orig_item = $item; $priority = PRIORITY_HIGH; @@ -1103,19 +1048,15 @@ class Item Post\ThreadUser::insert($item['uri-id'], $item['uid'], $item); } - // Remove all fields that aren't part of the item table - foreach ($item as $field => $value) { - if (!in_array($field, $structure['item'])) { - unset($item[$field]); - } - } - $condition = ['uri-id' => $item['uri-id'], 'uid' => $item['uid'], 'network' => $item['network']]; if (Post::exists($condition)) { Logger::notice('Item is already inserted - aborting', $condition); return 0; } + // Remove all fields that aren't part of the item table + $item = DBStructure::getFieldsForTable('item', $item); + $result = DBA::insert('item', $item); // When the item was successfully stored we fetch the ID of the item. diff --git a/src/Model/Post.php b/src/Model/Post.php index 5bb41d16c..c5a4b8ba1 100644 --- a/src/Model/Post.php +++ b/src/Model/Post.php @@ -272,7 +272,7 @@ class Post unset($selected['pinned']); $selected = array_flip($selected); - $select_string = "(SELECT `pinned` FROM `user-item` WHERE `iid` = `" . $view . "`.`id` AND uid=`" . $view . "`.`uid`) AS `pinned`, "; + $select_string = "(SELECT `pinned` FROM `post-thread-user` WHERE `uri-id` = `" . $view . "`.`uri-id` AND uid=`" . $view . "`.`uid`) AS `pinned`, "; } $select_string .= implode(', ', array_map([DBA::class, 'quoteIdentifier'], $selected)); @@ -344,32 +344,6 @@ class Post } } - /** - * Retrieve a single record from the starting post in the item table and returns it in an associative array - * - * @param integer $uid User ID - * @param array $selected - * @param array $condition - * @param array $params - * @return bool|array - * @throws \Exception - * @see DBA::select - */ - public static function selectFirstThreadForUser($uid, array $selected = [], array $condition = [], $params = []) - { - $params['limit'] = 1; - - $result = self::selectThreadForUser($uid, $selected, $condition, $params); - - if (is_bool($result)) { - return $result; - } else { - $row = self::fetch($result); - DBA::close($result); - return $row; - } - } - /** * Select pinned rows from the item table for a given user * @@ -383,24 +357,24 @@ class Post */ public static function selectPinned(int $uid, array $selected = [], array $condition = [], $params = []) { - $useritems = DBA::select('user-item', ['iid'], ['uid' => $uid, 'pinned' => true]); - if (!DBA::isResult($useritems)) { - return $useritems; + $postthreaduser = DBA::select('post-thread-user', ['uri-id'], ['uid' => $uid, 'pinned' => true]); + if (!DBA::isResult($postthreaduser)) { + return $postthreaduser; } - + $pinned = []; - while ($useritem = DBA::fetch($useritems)) { - $pinned[] = $useritem['iid']; + while ($useritem = DBA::fetch($postthreaduser)) { + $pinned[] = $useritem['uri-id']; } - DBA::close($useritems); + DBA::close($postthreaduser); if (empty($pinned)) { return []; } - $condition = DBA::mergeConditions(['iid' => $pinned], $condition); + $condition = DBA::mergeConditions(['uri-id' => $pinned, 'uid' => $uid, 'gravity' => GRAVITY_PARENT], $condition); - return self::selectThreadForUser($uid, $selected, $condition, $params); + return self::selectForUser($uid, $selected, $condition, $params); } /** diff --git a/src/Model/Post/ThreadUser.php b/src/Model/Post/ThreadUser.php index c824b44c8..f0f2f17a0 100644 --- a/src/Model/Post/ThreadUser.php +++ b/src/Model/Post/ThreadUser.php @@ -96,4 +96,58 @@ class ThreadUser { return DBA::delete('post-thread-user', $conditions, $options); } + + /** + * @param int $uri_id + * @param int $uid + * @return bool + * @throws Exception + */ + public static function getIgnored(int $uri_id, int $uid) + { + $threaduser = DBA::selectFirst('post-thread-user', ['ignored'], ['uri-id' => $uri_id, 'uid' => $uid]); + if (empty($threaduser)) { + return false; + } + return (bool)$threaduser['ignored']; + } + + /** + * @param int $uri_id + * @param int $uid + * @param int $ignored + * @return void + * @throws Exception + */ + public static function setIgnored(int $uri_id, int $uid, int $ignored) + { + DBA::update('post-thread-user', ['ignored' => $ignored], ['uri-id' => $uri_id, 'uid' => $uid], true); + } + + /** + * @param int $uri_id + * @param int $uid + * @return bool + * @throws Exception + */ + public static function getPinned(int $uri_id, int $uid) + { + $threaduser = DBA::selectFirst('post-thread-user', ['pinned'], ['uri-id' => $uri_id, 'uid' => $uid]); + if (empty($threaduser)) { + return false; + } + return (bool)$threaduser['pinned']; + } + + /** + * @param int $uri_id + * @param int $uid + * @param int $pinned + * @return void + * @throws Exception + */ + public static function setPinned(int $uri_id, int $uid, int $pinned) + { + DBA::update('post-thread-user', ['pinned' => $pinned], ['uri-id' => $uri_id, 'uid' => $uid], true); + } } diff --git a/src/Model/UserItem.php b/src/Model/UserItem.php index b4346c221..e4badadb0 100644 --- a/src/Model/UserItem.php +++ b/src/Model/UserItem.php @@ -52,7 +52,7 @@ class UserItem public static function setNotification(int $iid) { $fields = ['id', 'uri-id', 'parent-uri-id', 'uid', 'body', 'parent', 'gravity', - 'private', 'contact-id', 'thr-parent', 'parent-uri', 'author-id', 'verb']; + 'private', 'contact-id', 'thr-parent', 'parent-uri-id', 'parent-uri', 'author-id', 'verb']; $item = Post::selectFirst($fields, ['id' => $iid, 'origin' => false]); if (!DBA::isResult($item)) { return; @@ -92,8 +92,7 @@ class UserItem */ private static function setNotificationForUser(array $item, int $uid) { - $thread = Post::selectFirstThreadForUser($uid, ['ignored'], ['iid' => $item['parent'], 'deleted' => false]); - if (!empty($thread['ignored'])) { + if (Post\ThreadUser::getIgnored($item['parent-uri-id'], $uid)) { return; } diff --git a/src/Module/Item/Ignore.php b/src/Module/Item/Ignore.php index 668e49310..22d676b22 100644 --- a/src/Module/Item/Ignore.php +++ b/src/Module/Item/Ignore.php @@ -49,27 +49,17 @@ class Ignore extends BaseModule $dba = DI::dba(); - $thread = Post::selectFirstThreadForUser(local_user(), ['uid', 'ignored'], ['iid' => $itemId]); + $thread = Post::selectFirst(['uri-id', 'uid'], ['id' => $itemId, 'gravity' => GRAVITY_PARENT]); if (!$dba->isResult($thread)) { throw new HTTPException\NotFoundException(); } - // Numeric values are needed for the json output further below - $ignored = !empty($thread['ignored']) ? 0 : 1; + $ignored = !Post\ThreadUser::getIgnored($thread['uri-id'], local_user()); - switch ($thread['uid'] ?? 0) { - // if the thread is from the current user - case local_user(): - $dba->update('thread', ['ignored' => $ignored], ['iid' => $itemId]); - break; - // 0 (null will get transformed to 0) => it's a public post - case 0: - $dba->update('user-item', ['ignored' => $ignored], ['iid' => $itemId, 'uid' => local_user()], true); - break; - // Throws a BadRequestException and not a ForbiddenException on purpose - // Avoids harvesting existing, but forbidden IIDs (security issue) - default: - throw new HTTPException\BadRequestException(); + if (in_array($thread['uid'], [0, local_user()])) { + Post\ThreadUser::setIgnored($thread['uri-id'], local_user(), $ignored); + } else { + throw new HTTPException\BadRequestException(); } // See if we've been passed a return path to redirect to diff --git a/src/Module/Item/Pin.php b/src/Module/Item/Pin.php index d99b1a345..08c751de2 100644 --- a/src/Module/Item/Pin.php +++ b/src/Module/Item/Pin.php @@ -24,8 +24,9 @@ namespace Friendica\Module\Item; use Friendica\BaseModule; use Friendica\Core\Session; use Friendica\Core\System; +use Friendica\Database\DBA; use Friendica\DI; -use Friendica\Model\Item; +use Friendica\Model\Post; use Friendica\Network\HTTPException; /** @@ -47,9 +48,18 @@ class Pin extends BaseModule $itemId = intval($parameters['id']); - $pinned = !Item::getPinned($itemId, local_user()); + $item = Post::selectFirst(['uri-id', 'uid'], ['id' => $itemId]); + if (!DBA::isResult($item)) { + throw new HTTPException\NotFoundException(); + } - Item::setPinned($itemId, local_user(), $pinned); + if (!in_array($item['uid'], [0, local_user()])) { + throw new HttpException\ForbiddenException($l10n->t('Access denied.')); + } + + $pinned = !Post\ThreadUser::getPinned($item['uri-id'], local_user()); + + Post\ThreadUser::setPinned($item['uri-id'], local_user(), $pinned); // See if we've been passed a return path to redirect to $return_path = $_REQUEST['return'] ?? ''; diff --git a/src/Object/Post.php b/src/Object/Post.php index 34f46f797..d2c0b31e1 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -307,17 +307,15 @@ class Post if ($this->isToplevel()) { if(local_user()) { - $thread = PostModel::selectFirstThreadForUser(local_user(), ['ignored'], ['iid' => $item['id']]); - if (DBA::isResult($thread)) { - $ignore = [ - 'do' => DI::l10n()->t("ignore thread"), - 'undo' => DI::l10n()->t("unignore thread"), - 'toggle' => DI::l10n()->t("toggle ignore status"), - 'classdo' => $thread['ignored'] ? "hidden" : "", - 'classundo' => $thread['ignored'] ? "" : "hidden", - 'ignored' => DI::l10n()->t('ignored'), - ]; - } + $ignored = PostModel\ThreadUser::getIgnored($item['uri-id'], local_user()); + $ignore = [ + '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", + 'ignored' => DI::l10n()->t('ignored'), + ]; if ($conv->getProfileOwner() == local_user() && ($item['uid'] != 0)) { if ($origin) { diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index e38e23469..f201a3a5c 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -55,7 +55,7 @@ use Friendica\Database\DBA; if (!defined('DB_UPDATE_VERSION')) { - define('DB_UPDATE_VERSION', 1396); + define('DB_UPDATE_VERSION', 1397); } return [ @@ -750,7 +750,6 @@ return [ "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this item"], "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"], - "uri-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"], "parent" => ["type" => "int unsigned", "relation" => ["item" => "id"], "comment" => "item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item"], "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "uri of the top-level parent to this item"], "parent-uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the top-level parent uri"], @@ -774,7 +773,7 @@ return [ "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "moderated" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item has been deleted"], - // User specific fields. Eventually they will move to user-item + // User specific fields. Eventually they will move to post-user and post-thread-user "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "Owner id which owns this copy of the item"], "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id"], "comment" => "contact.id"], "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "This item was posted to the wall of uid"], @@ -789,6 +788,7 @@ return [ "resource-id" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type"], "event-id" => ["type" => "int unsigned", "relation" => ["event" => "id"], "comment" => "Used to link to the event.id"], // Deprecated fields. Will be removed in upcoming versions + "uri-hash" => ["type" => "varchar(80)", "comment" => "Deprecated"], "iaid" => ["type" => "int unsigned", "comment" => "Deprecated"], "icid" => ["type" => "int unsigned", "comment" => "Deprecated"], "attach" => ["type" => "mediumtext", "comment" => "Deprecated"], @@ -1208,6 +1208,7 @@ return [ "indexes" => [ "PRIMARY" => ["uid", "uri-id"], "uid_wall" => ["uid", "wall"], + "uid_pinned" => ["uid", "pinned"], "uri-id" => ["uri-id"], ] ], diff --git a/static/dbview.config.php b/static/dbview.config.php index c7f52a5cf..088e426ba 100644 --- a/static/dbview.config.php +++ b/static/dbview.config.php @@ -395,13 +395,13 @@ "query" => "FROM `item` INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent` STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` - LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid` + LEFT JOIN `post-user` ON `post-user`.`uri-id` = `item`.`uri-id` AND `post-user`.`uid` = `thread`.`uid` LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id` LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id` LEFT JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `thread`.`owner-id` WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated` AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`) - AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`) + AND (`post-user`.`hidden` IS NULL OR NOT `post-user`.`hidden`) AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`) AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`)" ], @@ -424,13 +424,13 @@ "query" => "FROM `thread` STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid` - LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid` + LEFT JOIN `post-user` ON `post-user`.`uri-id` = `item`.`uri-id` AND `post-user`.`uid` = `thread`.`uid` LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id` LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id` LEFT JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `thread`.`owner-id` WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated` AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`) - AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`) + AND (`post-user`.`hidden` IS NULL OR NOT `post-user`.`hidden`) AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`) AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`)" ], diff --git a/update.php b/update.php index f2dd66577..05064d8e0 100644 --- a/update.php +++ b/update.php @@ -715,9 +715,9 @@ function update_1396() return Update::SUCCESS; } -function update_139x() +function update_1397() { - if (!DBStructure::existsTable('thread') || DBStructure::existsTable('user-item')) { + if (!DBStructure::existsTable('thread') || !DBStructure::existsTable('user-item')) { return Update::SUCCESS; }