Improved profile page, improved "limit" handling (#5639)

* Improved profile page, improved "limit" handling

* Update will now work again

* Update will work now
This commit is contained in:
Michael Vogel 2018-08-20 06:26:05 +02:00 committed by Tobias Diekershoff
parent 47c2565917
commit 16a081871c
6 changed files with 34 additions and 55 deletions

View file

@ -471,6 +471,7 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
. "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n"; . "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
} }
} elseif ($mode === 'profile') { } elseif ($mode === 'profile') {
$items = conversation_add_children($items, false, $order, $uid);
$profile_owner = $a->profile['profile_uid']; $profile_owner = $a->profile['profile_uid'];
if (!$update) { if (!$update) {

View file

@ -195,15 +195,14 @@ function community_getitems($start, $itemspage, $content)
INNER JOIN `contact` AS `author` ON `author`.`id`=`item`.`author-id` INNER JOIN `contact` AS `author` ON `author`.`id`=`item`.`author-id`
WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated` WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
AND NOT `thread`.`private` AND `thread`.`wall` AND `thread`.`origin` AND NOT `thread`.`private` AND `thread`.`wall` AND `thread`.`origin`
ORDER BY `thread`.`commented` DESC LIMIT " . intval($start) . ", " . intval($itemspage) ORDER BY `thread`.`commented` DESC LIMIT ?, ?", $start, $itemspage);
);
return DBA::toArray($r); return DBA::toArray($r);
} elseif ($content == 'global') { } elseif ($content == 'global') {
$r = DBA::p("SELECT `uri` FROM `thread` $r = DBA::p("SELECT `uri` FROM `thread`
INNER JOIN `item` ON `item`.`id` = `thread`.`iid` INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
INNER JOIN `contact` AS `author` ON `author`.`id`=`item`.`author-id` INNER JOIN `contact` AS `author` ON `author`.`id`=`item`.`author-id`
WHERE `thread`.`uid` = 0 AND NOT `author`.`hidden` AND NOT `author`.`blocked` WHERE `thread`.`uid` = 0 AND NOT `author`.`hidden` AND NOT `author`.`blocked`
ORDER BY `thread`.`commented` DESC LIMIT " . intval($start) . ", " . intval($itemspage)); ORDER BY `thread`.`commented` DESC LIMIT ?, ?", $start, $itemspage);
return DBA::toArray($r); return DBA::toArray($r);
} }

View file

@ -23,7 +23,7 @@ use Friendica\Util\DateTimeFormat;
function profile_init(App $a) function profile_init(App $a)
{ {
if (!x($a->page, 'aside')) { if (empty($a->page['aside'])) {
$a->page['aside'] = ''; $a->page['aside'] = '';
} }
@ -54,15 +54,15 @@ function profile_init(App $a)
$blocked = !local_user() && !remote_user() && Config::get('system', 'block_public'); $blocked = !local_user() && !remote_user() && Config::get('system', 'block_public');
$userblock = !local_user() && !remote_user() && $a->profile['hidewall']; $userblock = !local_user() && !remote_user() && $a->profile['hidewall'];
if (x($a->profile, 'page-flags') && $a->profile['page-flags'] == Contact::PAGE_COMMUNITY) { if (!empty($a->profile['page-flags']) && $a->profile['page-flags'] == Contact::PAGE_COMMUNITY) {
$a->page['htmlhead'] .= '<meta name="friendica.community" content="true" />'; $a->page['htmlhead'] .= '<meta name="friendica.community" content="true" />';
} }
if (x($a->profile, 'openidserver')) { if (!empty($a->profile['openidserver'])) {
$a->page['htmlhead'] .= '<link rel="openid.server" href="' . $a->profile['openidserver'] . '" />' . "\r\n"; $a->page['htmlhead'] .= '<link rel="openid.server" href="' . $a->profile['openidserver'] . '" />' . "\r\n";
} }
if (x($a->profile, 'openid')) { if (!empty($a->profile['openid'])) {
$delegate = strstr($a->profile['openid'], '://') ? $a->profile['openid'] : 'https://' . $a->profile['openid']; $delegate = strstr($a->profile['openid'], '://') ? $a->profile['openid'] : 'https://' . $a->profile['openid'];
$a->page['htmlhead'] .= '<link rel="openid.delegate" href="' . $delegate . '" />' . "\r\n"; $a->page['htmlhead'] .= '<link rel="openid.delegate" href="' . $delegate . '" />' . "\r\n";
} }
@ -109,7 +109,7 @@ function profile_content(App $a, $update = 0)
} }
} }
if (!x($category)) { if (empty($category)) {
$category = defaults($_GET, 'category', ''); $category = defaults($_GET, 'category', '');
} }
@ -140,7 +140,7 @@ function profile_content(App $a, $update = 0)
$contact_id = 0; $contact_id = 0;
if (x($_SESSION, 'remote') && is_array($_SESSION['remote'])) { if (!empty($_SESSION['remote'])) {
foreach ($_SESSION['remote'] as $v) { foreach ($_SESSION['remote'] as $v) {
if ($v['uid'] == $a->profile['profile_uid']) { if ($v['uid'] == $a->profile['profile_uid']) {
$contact_id = $v['cid']; $contact_id = $v['cid'];
@ -171,14 +171,14 @@ function profile_content(App $a, $update = 0)
$is_owner = local_user() == $a->profile['profile_uid']; $is_owner = local_user() == $a->profile['profile_uid'];
$last_updated_key = "profile:" . $a->profile['profile_uid'] . ":" . local_user() . ":" . remote_user(); $last_updated_key = "profile:" . $a->profile['profile_uid'] . ":" . local_user() . ":" . remote_user();
if (x($a->profile, 'hidewall') && !$is_owner && !$remote_contact) { if (!empty($a->profile['hidewall']) && !$is_owner && !$remote_contact) {
notice(L10n::t('Access to this profile has been restricted.') . EOL); notice(L10n::t('Access to this profile has been restricted.') . EOL);
return; return;
} }
if (!$update) { if (!$update) {
$tab = false; $tab = false;
if (x($_GET, 'tab')) { if (!empty($_GET['tab'])) {
$tab = notags(trim($_GET['tab'])); $tab = notags(trim($_GET['tab']));
} }
@ -196,7 +196,7 @@ function profile_content(App $a, $update = 0)
$commvisitor = $commpage && $remote_contact; $commvisitor = $commpage && $remote_contact;
$a->page['aside'] .= posted_date_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], $a->profile['profile_uid'], true); $a->page['aside'] .= posted_date_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], $a->profile['profile_uid'], true);
$a->page['aside'] .= Widget::categories(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], (x($category) ? xmlify($category) : '')); $a->page['aside'] .= Widget::categories(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], (!empty($category) ? xmlify($category) : ''));
$a->page['aside'] .= Widget::tagCloud(); $a->page['aside'] .= Widget::tagCloud();
if (can_write_wall($a->profile['profile_uid'])) { if (can_write_wall($a->profile['profile_uid'])) {
@ -227,7 +227,7 @@ function profile_content(App $a, $update = 0)
$sql_extra2 = ''; $sql_extra2 = '';
if ($update) { if ($update) {
$last_updated = (x($_SESSION['last_updated'], $last_updated_key) ? $_SESSION['last_updated'][$last_updated_key] : 0); $last_updated = (!empty($_SESSION['last_updated'][$last_updated_key]) ? $_SESSION['last_updated'][$last_updated_key] : 0);
// If the page user is the owner of the page we should query for unseen // If the page user is the owner of the page we should query for unseen
// items. Otherwise use a timestamp of the last succesful update request. // items. Otherwise use a timestamp of the last succesful update request.
@ -238,7 +238,7 @@ function profile_content(App $a, $update = 0)
$sql_extra4 = " AND `item`.`received` > '" . $gmupdate . "'"; $sql_extra4 = " AND `item`.`received` > '" . $gmupdate . "'";
} }
$r = q("SELECT distinct(parent) AS `item_id`, `item`.`network` AS `item_network`, `item`.`created` $items = q("SELECT DISTINCT(`parent-uri`) AS `uri`
FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
AND NOT `contact`.`blocked` AND NOT `contact`.`pending` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
WHERE `item`.`uid` = %d AND `item`.`visible` AND WHERE `item`.`uid` = %d AND `item`.`visible` AND
@ -250,38 +250,33 @@ function profile_content(App $a, $update = 0)
intval($a->profile['profile_uid']), intval(GRAVITY_ACTIVITY) intval($a->profile['profile_uid']), intval(GRAVITY_ACTIVITY)
); );
if (!DBA::isResult($r)) { if (!DBA::isResult($items)) {
return ''; return '';
} }
} else { } else {
$sql_post_table = ""; $sql_post_table = "";
if (x($category)) { if (!empty($category)) {
$sql_post_table = sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ", $sql_post_table = sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ",
DBA::escape(protect_sprintf($category)), intval(TERM_OBJ_POST), intval(TERM_CATEGORY), intval($a->profile['profile_uid'])); DBA::escape(protect_sprintf($category)), intval(TERM_OBJ_POST), intval(TERM_CATEGORY), intval($a->profile['profile_uid']));
} }
if (x($hashtags)) { if (!empty($hashtags)) {
$sql_post_table .= sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ", $sql_post_table .= sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ",
DBA::escape(protect_sprintf($hashtags)), intval(TERM_OBJ_POST), intval(TERM_HASHTAG), intval($a->profile['profile_uid'])); DBA::escape(protect_sprintf($hashtags)), intval(TERM_OBJ_POST), intval(TERM_HASHTAG), intval($a->profile['profile_uid']));
} }
if ($datequery) { if (!empty($datequery)) {
$sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` <= '%s' ", DBA::escape(DateTimeFormat::convert($datequery, 'UTC', date_default_timezone_get())))); $sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` <= '%s' ", DBA::escape(DateTimeFormat::convert($datequery, 'UTC', date_default_timezone_get()))));
} }
if ($datequery2) { if (!empty($datequery2)) {
$sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` >= '%s' ", DBA::escape(DateTimeFormat::convert($datequery2, 'UTC', date_default_timezone_get())))); $sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` >= '%s' ", DBA::escape(DateTimeFormat::convert($datequery2, 'UTC', date_default_timezone_get()))));
} }
// Belongs the profile page to a forum? // Does the profile page belong to a forum?
// If not then we can improve the performance with an additional condition // If not then we can improve the performance with an additional condition
$r = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `page-flags` IN (%d, %d)", $condition = ['uid' => $a->profile['profile_uid'], 'page-flags' => [Contact::PAGE_COMMUNITY, Contact::PAGE_PRVGROUP]];
intval($a->profile['profile_uid']), if (!DBA::exists('user', $condition)) {
intval(Contact::PAGE_COMMUNITY),
intval(Contact::PAGE_PRVGROUP)
);
if (!DBA::isResult($r)) {
$sql_extra3 = sprintf(" AND `thread`.`contact-id` = %d ", intval(intval($a->profile['contact_id']))); $sql_extra3 = sprintf(" AND `thread`.`contact-id` = %d ", intval(intval($a->profile['contact_id'])));
} else { } else {
$sql_extra3 = ""; $sql_extra3 = "";
@ -305,7 +300,7 @@ function profile_content(App $a, $update = 0)
$pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage']));
$r = q("SELECT `thread`.`iid` AS `item_id`, `thread`.`network` AS `item_network` $items = q("SELECT `item`.`uri`
FROM `thread` FROM `thread`
STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid` STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid`
$sql_post_table $sql_post_table
@ -321,31 +316,15 @@ function profile_content(App $a, $update = 0)
); );
} }
$parents_arr = [];
$parents_str = '';
// Set a time stamp for this page. We will make use of it when we // Set a time stamp for this page. We will make use of it when we
// search for new items (update routine) // search for new items (update routine)
$_SESSION['last_updated'][$last_updated_key] = time(); $_SESSION['last_updated'][$last_updated_key] = time();
if (DBA::isResult($r)) {
foreach ($r as $rr) {
$parents_arr[] = $rr['item_id'];
}
$condition = ['uid' => $a->profile['profile_uid'], 'parent' => $parents_arr];
$result = Item::selectForUser($a->profile['profile_uid'], [], $condition);
$items = conv_sort(Item::inArray($result), 'created');
} else {
$items = [];
}
if ($is_owner && !$update && !Config::get('theme', 'hide_eventlist')) { if ($is_owner && !$update && !Config::get('theme', 'hide_eventlist')) {
$o .= Profile::getBirthdays(); $o .= Profile::getBirthdays();
$o .= Profile::getEventsReminderHTML(); $o .= Profile::getEventsReminderHTML();
} }
if ($is_owner) { if ($is_owner) {
$unseen = Item::exists(['wall' => true, 'unseen' => true, 'uid' => local_user()]); $unseen = Item::exists(['wall' => true, 'unseen' => true, 'uid' => local_user()]);
if ($unseen) { if ($unseen) {

View file

@ -1459,7 +1459,7 @@ class DBA
$limit_string = ''; $limit_string = '';
if (isset($params['limit']) && is_int($params['limit'])) { if (isset($params['limit']) && is_int($params['limit'])) {
$limit_string = " LIMIT " . $params['limit']; $limit_string = " LIMIT " . intval($params['limit']);
} }
if (isset($params['limit']) && is_array($params['limit'])) { if (isset($params['limit']) && is_array($params['limit'])) {

View file

@ -84,7 +84,7 @@ class DBClean {
$r = DBA::p("SELECT `id` FROM `item` WHERE `uid` = 0 AND $r = DBA::p("SELECT `id` FROM `item` WHERE `uid` = 0 AND
NOT EXISTS (SELECT `guid` FROM `item` AS `i` WHERE `item`.`guid` = `i`.`guid` AND `i`.`uid` != 0) AND NOT EXISTS (SELECT `guid` FROM `item` AS `i` WHERE `item`.`guid` = `i`.`guid` AND `i`.`uid` != 0) AND
`received` < UTC_TIMESTAMP() - INTERVAL ? DAY AND `id` >= ? `received` < UTC_TIMESTAMP() - INTERVAL ? DAY AND `id` >= ?
ORDER BY `id` LIMIT ".intval($limit), $days_unclaimed, $last_id); ORDER BY `id` LIMIT ?", $days_unclaimed, $last_id, $limit);
$count = DBA::numRows($r); $count = DBA::numRows($r);
if ($count > 0) { if ($count > 0) {
logger("found global item orphans: ".$count); logger("found global item orphans: ".$count);
@ -106,7 +106,7 @@ class DBClean {
logger("Deleting items without parents. Last ID: ".$last_id); logger("Deleting items without parents. Last ID: ".$last_id);
$r = DBA::p("SELECT `id` FROM `item` $r = DBA::p("SELECT `id` FROM `item`
WHERE NOT EXISTS (SELECT `id` FROM `item` AS `i` WHERE `item`.`parent` = `i`.`id`) WHERE NOT EXISTS (SELECT `id` FROM `item` AS `i` WHERE `item`.`parent` = `i`.`id`)
AND `id` >= ? ORDER BY `id` LIMIT ".intval($limit), $last_id); AND `id` >= ? ORDER BY `id` LIMIT ?", $last_id, $limit);
$count = DBA::numRows($r); $count = DBA::numRows($r);
if ($count > 0) { if ($count > 0) {
logger("found item orphans without parents: ".$count); logger("found item orphans without parents: ".$count);
@ -132,7 +132,7 @@ class DBClean {
logger("Deleting orphaned data from thread table. Last ID: ".$last_id); logger("Deleting orphaned data from thread table. Last ID: ".$last_id);
$r = DBA::p("SELECT `iid` FROM `thread` $r = DBA::p("SELECT `iid` FROM `thread`
WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `thread`.`iid`) AND `iid` >= ? WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `thread`.`iid`) AND `iid` >= ?
ORDER BY `iid` LIMIT ".intval($limit), $last_id); ORDER BY `iid` LIMIT ?", $last_id, $limit);
$count = DBA::numRows($r); $count = DBA::numRows($r);
if ($count > 0) { if ($count > 0) {
logger("found thread orphans: ".$count); logger("found thread orphans: ".$count);
@ -158,7 +158,7 @@ class DBClean {
logger("Deleting orphaned data from notify table. Last ID: ".$last_id); logger("Deleting orphaned data from notify table. Last ID: ".$last_id);
$r = DBA::p("SELECT `iid`, `id` FROM `notify` $r = DBA::p("SELECT `iid`, `id` FROM `notify`
WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `notify`.`iid`) AND `id` >= ? WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `notify`.`iid`) AND `id` >= ?
ORDER BY `id` LIMIT ".intval($limit), $last_id); ORDER BY `id` LIMIT ?", $last_id, $limit);
$count = DBA::numRows($r); $count = DBA::numRows($r);
if ($count > 0) { if ($count > 0) {
logger("found notify orphans: ".$count); logger("found notify orphans: ".$count);
@ -184,7 +184,7 @@ class DBClean {
logger("Deleting orphaned data from notify-threads table. Last ID: ".$last_id); logger("Deleting orphaned data from notify-threads table. Last ID: ".$last_id);
$r = DBA::p("SELECT `id` FROM `notify-threads` $r = DBA::p("SELECT `id` FROM `notify-threads`
WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `notify-threads`.`master-parent-item`) AND `id` >= ? WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `notify-threads`.`master-parent-item`) AND `id` >= ?
ORDER BY `id` LIMIT ".intval($limit), $last_id); ORDER BY `id` LIMIT ?", $last_id, $limit);
$count = DBA::numRows($r); $count = DBA::numRows($r);
if ($count > 0) { if ($count > 0) {
logger("found notify-threads orphans: ".$count); logger("found notify-threads orphans: ".$count);
@ -210,7 +210,7 @@ class DBClean {
logger("Deleting orphaned data from sign table. Last ID: ".$last_id); logger("Deleting orphaned data from sign table. Last ID: ".$last_id);
$r = DBA::p("SELECT `iid`, `id` FROM `sign` $r = DBA::p("SELECT `iid`, `id` FROM `sign`
WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `sign`.`iid`) AND `id` >= ? WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `sign`.`iid`) AND `id` >= ?
ORDER BY `id` LIMIT ".intval($limit), $last_id); ORDER BY `id` LIMIT ?", $last_id, $limit);
$count = DBA::numRows($r); $count = DBA::numRows($r);
if ($count > 0) { if ($count > 0) {
logger("found sign orphans: ".$count); logger("found sign orphans: ".$count);
@ -236,7 +236,7 @@ class DBClean {
logger("Deleting orphaned data from term table. Last ID: ".$last_id); logger("Deleting orphaned data from term table. Last ID: ".$last_id);
$r = DBA::p("SELECT `oid`, `tid` FROM `term` $r = DBA::p("SELECT `oid`, `tid` FROM `term`
WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `term`.`oid`) AND `tid` >= ? WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `term`.`oid`) AND `tid` >= ?
ORDER BY `tid` LIMIT ".intval($limit), $last_id); ORDER BY `tid` LIMIT ?", $last_id, $limit);
$count = DBA::numRows($r); $count = DBA::numRows($r);
if ($count > 0) { if ($count > 0) {
logger("found term orphans: ".$count); logger("found term orphans: ".$count);
@ -303,7 +303,7 @@ class DBClean {
$r = DBA::p("SELECT `id` FROM `item` WHERE `uid` = 0 AND $r = DBA::p("SELECT `id` FROM `item` WHERE `uid` = 0 AND
NOT EXISTS (SELECT `guid` FROM `item` AS `i` WHERE `item`.`guid` = `i`.`guid` AND `i`.`uid` != 0) AND NOT EXISTS (SELECT `guid` FROM `item` AS `i` WHERE `item`.`guid` = `i`.`guid` AND `i`.`uid` != 0) AND
`received` < UTC_TIMESTAMP() - INTERVAL 90 DAY AND `id` >= ? AND `id` <= ? `received` < UTC_TIMESTAMP() - INTERVAL 90 DAY AND `id` >= ? AND `id` <= ?
ORDER BY `id` LIMIT ".intval($limit), $last_id, $till_id); ORDER BY `id` LIMIT ?", $last_id, $till_id, $limit);
$count = DBA::numRows($r); $count = DBA::numRows($r);
if ($count > 0) { if ($count > 0) {
logger("found global item entries from expired threads: ".$count); logger("found global item entries from expired threads: ".$count);
@ -326,7 +326,7 @@ class DBClean {
logger("Deleting old conversations. Last created: ".$last_id); logger("Deleting old conversations. Last created: ".$last_id);
$r = DBA::p("SELECT `received`, `item-uri` FROM `conversation` $r = DBA::p("SELECT `received`, `item-uri` FROM `conversation`
WHERE `received` < UTC_TIMESTAMP() - INTERVAL ? DAY WHERE `received` < UTC_TIMESTAMP() - INTERVAL ? DAY
ORDER BY `received` LIMIT ".intval($limit), $days); ORDER BY `received` LIMIT ?", $days, $limit);
$count = DBA::numRows($r); $count = DBA::numRows($r);
if ($count > 0) { if ($count > 0) {
logger("found old conversations: ".$count); logger("found old conversations: ".$count);