diff --git a/database.sql b/database.sql index a74d4ea6a3..9fab6668d8 100644 --- a/database.sql +++ b/database.sql @@ -717,8 +717,10 @@ CREATE TABLE IF NOT EXISTS `item` ( `mention` boolean NOT NULL DEFAULT '0' COMMENT 'The owner of this item was mentioned in it', `forum_mode` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '', `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', + `type` varchar(20) COMMENT '', + `bookmark` boolean COMMENT '', + `resource-id` varchar(32) COMMENT 'Deprecated', `uri-hash` varchar(80) COMMENT 'Deprecated', `iaid` int unsigned COMMENT 'Deprecated', `icid` int unsigned COMMENT 'Deprecated', @@ -729,8 +731,6 @@ CREATE TABLE IF NOT EXISTS `item` ( `deny_gid` mediumtext COMMENT 'Deprecated', `postopts` text COMMENT 'Deprecated', `inform` mediumtext COMMENT 'Deprecated', - `type` varchar(20) COMMENT 'Deprecated', - `bookmark` boolean COMMENT 'Deprecated', `file` mediumtext COMMENT 'Deprecated', `location` varchar(255) COMMENT 'Deprecated', `coord` varchar(255) COMMENT 'Deprecated', diff --git a/src/Model/Item.php b/src/Model/Item.php index 9edafaf5fc..19f382b67e 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -98,14 +98,6 @@ class Item 'author-id', 'author-link', 'owner-link', 'contact-uid', 'signed_text', 'network']; - // Field list for "post-content" table that is mixed with the item table - const MIXED_CONTENT_FIELDLIST = ['title', 'content-warning', 'body', 'location', - 'coord', 'app', 'rendered-hash', 'rendered-html', 'verb', - 'object-type', 'object', 'target-type', 'target', 'plink']; - - // Field list for "post-content" table that is not present in the "item" table - const CONTENT_FIELDLIST = ['language', 'raw-body']; - // All fields in the item table const ITEM_FIELDLIST = ['id', 'uid', 'parent', 'uri', 'parent-uri', 'thr-parent', 'guid', 'uri-id', 'parent-uri-id', 'thr-parent-id', 'vid', @@ -120,6 +112,22 @@ class Item 'author-id', 'author-link', 'author-name', 'author-avatar', 'author-network', 'owner-id', 'owner-link', 'owner-name', 'owner-avatar', 'causer-id']; + // Item fiels that still are in use + const USED_FIELDLIST = ['id', 'parent', 'guid', 'uri', 'uri-id', 'parent-uri', 'parent-uri-id', + 'thr-parent', 'thr-parent-id', 'created', 'edited', 'commented', 'received', 'changed', + 'gravity', 'network', 'owner-id', 'author-id', 'causer-id', 'vid', 'extid', 'post-type', + 'global', 'private', 'visible', 'moderated', 'deleted', 'uid', 'contact-id', + 'wall', 'origin', 'pubmail', 'starred', 'unseen', 'mention', 'forum_mode', 'psid', + 'event-id', 'type', 'bookmark']; + + // Legacy item fields that aren't stored any more in the item table + const LEGACY_FIELDLIST = ['uri-hash', 'iaid', 'icid', 'attach', + 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'postopts', + 'resource-id', 'inform', 'file', 'location', 'coord', 'tag', 'plink', + 'title', 'content-warning', 'body', 'app', 'verb', 'object-type', 'object', + 'target-type', 'target', 'author-name', 'author-link', 'author-avatar', + 'owner-name', 'owner-link', 'owner-avatar', 'rendered-hash', 'rendered-html']; + // List of all verbs that don't need additional content data. // Never reorder or remove entries from this list. Just add new ones at the end, if needed. const ACTIVITIES = [ @@ -897,26 +905,11 @@ class Item // Update the contact relations Contact\Relation::store($toplevel_parent['author-id'], $item['author-id'], $item['created']); - - unset($item['parent_origin']); } else { $parent_id = 0; $parent_origin = $item['origin']; } - // We don't store the causer link, only the id - unset($item['causer-link']); - - // We don't store these fields anymore in the item table - unset($item['author-link']); - unset($item['author-name']); - unset($item['author-avatar']); - unset($item['author-network']); - - unset($item['owner-link']); - unset($item['owner-name']); - unset($item['owner-avatar']); - $item['parent-uri-id'] = ItemURI::getIdByURI($item['parent-uri']); $item['thr-parent-id'] = ItemURI::getIdByURI($item['thr-parent']); @@ -939,14 +932,10 @@ class Item $item['edit'] = false; $item['parent'] = $parent_id; Hook::callAll('post_local', $item); - unset($item['edit']); } else { Hook::callAll('post_remote', $item); } - // Set after the insert because top-level posts are self-referencing - unset($item['parent']); - if (!empty($item['cancel'])) { Logger::log('post cancelled by addon.'); return 0; @@ -965,15 +954,6 @@ class Item $item['deny_gid'] ); - unset($item['allow_cid']); - unset($item['allow_gid']); - unset($item['deny_cid']); - unset($item['deny_gid']); - - // This array field is used to trigger some automatic reactions - // It is mainly used in the "post_local" hook. - unset($item['api_source']); - if ($item['verb'] == Activity::ANNOUNCE) { self::setOwnerforResharedItem($item); } @@ -985,10 +965,6 @@ class Item // Check for hashtags in the body and repair or add hashtag links $item['body'] = self::setHashtags($item['body']); - if (!empty($item['attach'])) { - Post\Media::insertFromAttachment($item['uri-id'], $item['attach']); - } - // Fill the cache field self::putInCache($item); @@ -998,40 +974,27 @@ class Item $notify_type = Delivery::POST; } + // Filling item related side tables + if (!empty($item['attach'])) { + Post\Media::insertFromAttachment($item['uri-id'], $item['attach']); + } + if (!in_array($item['verb'], self::ACTIVITIES)) { Post\Content::insert($item['uri-id'], $item); } - $body = $item['body']; - $verb = $item['verb']; - - // We just remove everything that is content - foreach (array_merge(self::CONTENT_FIELDLIST, self::MIXED_CONTENT_FIELDLIST) as $field) { - unset($item[$field]); - } - - unset($item['activity']); - - // Filling item related side tables - // Diaspora signature if (!empty($item['diaspora_signed_text'])) { DBA::replace('diaspora-interaction', ['uri-id' => $item['uri-id'], 'interaction' => $item['diaspora_signed_text']]); } - unset($item['diaspora_signed_text']); - // Attached file links if (!empty($item['file'])) { Post\Category::storeTextByURIId($item['uri-id'], $item['uid'], $item['file']); } - unset($item['file']); - // Delivery relevant data $delivery_data = Post\DeliveryData::extractFields($item); - unset($item['postopts']); - unset($item['inform']); if (!empty($item['origin']) || !empty($item['wall']) || !empty($delivery_data['postopts']) || !empty($delivery_data['inform'])) { Post\DeliveryData::insert($item['uri-id'], $delivery_data); @@ -1039,33 +1002,38 @@ class Item // Store tags from the body if this hadn't been handled previously in the protocol classes if (!Tag::existsForPost($item['uri-id'])) { - Tag::storeFromBody($item['uri-id'], $body); + Tag::storeFromBody($item['uri-id'], $item['body']); } $id = Post\User::insert($item['uri-id'], $item['uid'], $item); - if ($id) { - if ($item['gravity'] == GRAVITY_PARENT) { - Post\ThreadUser::insert($item['uri-id'], $item['uid'], $item); - } - - $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. - $current_post = DBA::lastInsertId(); - } else { + if (!$id) { Logger::notice('Post-User is already inserted - aborting', ['uid' => $item['uid'], 'uri-id' => $item['uri-id']]); return 0; } + if ($item['gravity'] == GRAVITY_PARENT) { + Post\ThreadUser::insert($item['uri-id'], $item['uid'], $item); + } + + $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); + + // We remove all legacy fields that now are stored in other tables + foreach (self::LEGACY_FIELDLIST as $field) { + unset($item[$field]); + } + + $result = DBA::insert('item', $item); + + // When the item was successfully stored we fetch the ID of the item. + $current_post = DBA::lastInsertId(); + if (empty($current_post) || !DBA::isResult($result)) { // On failure store the data into a spool file so that the "SpoolPost" worker can try again later. Logger::warning('Could not store item. it will be spooled', ['result' => $result, 'id' => $current_post]); @@ -1091,7 +1059,7 @@ class Item $update_commented = in_array($item['gravity'], [GRAVITY_PARENT, GRAVITY_COMMENT]); } else { // Update when it isn't a follow or tag verb - $update_commented = !in_array($verb, [Activity::FOLLOW, Activity::TAG]); + $update_commented = !in_array($item['verb'], [Activity::FOLLOW, Activity::TAG]); } if ($update_commented) { diff --git a/src/Model/Post.php b/src/Model/Post.php index c5a4b8ba19..5cafdf25ae 100644 --- a/src/Model/Post.php +++ b/src/Model/Post.php @@ -192,7 +192,7 @@ class Post $selected = array_merge(['author-addr', 'author-nick', 'owner-addr', 'owner-nick', 'causer-addr', 'causer-nick', 'causer-network', 'photo', 'name-date', 'uri-date', 'avatar-date', 'thumb', 'dfrn-id', 'parent-guid', 'parent-network', 'parent-author-id', 'parent-author-link', 'parent-author-name', - 'parent-author-network', 'signed_text'], Item::DISPLAY_FIELDLIST, Item::ITEM_FIELDLIST, Item::CONTENT_FIELDLIST); + 'parent-author-network', 'signed_text', 'language', 'raw-body'], Item::DISPLAY_FIELDLIST, Item::ITEM_FIELDLIST); if ($view == 'post-thread-view') { $selected = array_merge($selected, ['ignored', 'iid']); @@ -479,13 +479,8 @@ class Post $affected = max($affected, DBA::affectedRows()); } - $item_fields = ['guid', 'type', 'wall', 'gravity', 'extid', 'created', 'edited', 'commented', 'received', 'changed', - 'resource-id', 'post-type', 'private', 'pubmail', 'moderated', 'visible', 'starred', 'bookmark', - 'unseen', 'deleted', 'origin', 'forum_mode', 'mention', 'global', 'network', 'vid', 'psid', - 'contact-id', 'author-id', 'owner-id', 'causer-id', 'event-id']; - $update_fields = []; - foreach ($item_fields as $field) { + foreach (Item::USED_FIELDLIST as $field) { if (array_key_exists($field, $fields)) { $update_fields[$field] = $fields[$field]; } diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index f201a3a5c0..3b833d9e3a 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -785,9 +785,12 @@ return [ "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""], "psid" => ["type" => "int unsigned", "foreign" => ["permissionset" => "id", "on delete" => "restrict"], "comment" => "ID of the permission set of this post"], // It has to be decided whether these fields belong to the user or the structure - "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"], + // Check deprecation status + "type" => ["type" => "varchar(20)", "comment" => ""], + "bookmark" => ["type" => "boolean", "comment" => ""], // Deprecated fields. Will be removed in upcoming versions + "resource-id" => ["type" => "varchar(32)", "comment" => "Deprecated"], "uri-hash" => ["type" => "varchar(80)", "comment" => "Deprecated"], "iaid" => ["type" => "int unsigned", "comment" => "Deprecated"], "icid" => ["type" => "int unsigned", "comment" => "Deprecated"], @@ -798,8 +801,6 @@ return [ "deny_gid" => ["type" => "mediumtext", "comment" => "Deprecated"], "postopts" => ["type" => "text", "comment" => "Deprecated"], "inform" => ["type" => "mediumtext", "comment" => "Deprecated"], - "type" => ["type" => "varchar(20)", "comment" => "Deprecated"], - "bookmark" => ["type" => "boolean", "comment" => "Deprecated"], "file" => ["type" => "mediumtext", "comment" => "Deprecated"], "location" => ["type" => "varchar(255)", "comment" => "Deprecated"], "coord" => ["type" => "varchar(255)", "comment" => "Deprecated"],