Most user-item traces removed

This commit is contained in:
Michael 2021-01-31 23:37:34 +00:00
commit c1d99d6c4c
13 changed files with 139 additions and 153 deletions

View file

@ -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']);

View file

@ -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.

View file

@ -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);
}
/**

View file

@ -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);
}
}

View file

@ -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;
}

View file

@ -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

View file

@ -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'] ?? '';

View file

@ -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) {