diff --git a/src/Model/Tag.php b/src/Model/Tag.php index e2ce5ad0d5..cf453f2431 100644 --- a/src/Model/Tag.php +++ b/src/Model/Tag.php @@ -231,13 +231,18 @@ class Tag */ public static function remove(int $uriid, int $type, string $name, string $url = '') { - $tag = DBA::fetchFirst("SELECT `id` FROM `tag` INNER JOIN `post-tag` ON `post-tag`.`tid` = `tag`.`id` - WHERE `uri-id` = ? AND `type` = ? AND `name` = ? AND `url` = ?", $uriid, $type, $name, $url); + $condition = ['uri-id' => $uriid, 'type' => $type, 'url' => $url]; + if ($type == self::HASHTAG) { + $condition['name'] = $name; + } + + $tag = DBA::selectFirst('tag-view', ['tid', 'cid'], $condition); if (!DBA::isResult($tag)) { return; } - Logger::info('Removing tag/mention', ['uri-id' => $uriid, 'tid' => $tag['id'], 'name' => $name, 'url' => $url, 'callstack' => System::callstack(8)]); - DBA::delete('post-tag', ['uri-id' => $uriid, 'tid' => $tag['id']]); + + Logger::info('Removing tag/mention', ['uri-id' => $uriid, 'tid' => $tag['tid'], 'name' => $name, 'url' => $url, 'callstack' => System::callstack(8)]); + DBA::delete('post-tag', ['uri-id' => $uriid, 'type' => $type, 'tid' => $tag['tid'], 'cid' => $tag['cid']]); } /** diff --git a/src/Model/User.php b/src/Model/User.php index 4ef5ffa33c..e7f2f89ad6 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -195,66 +195,46 @@ class User */ public static function getOwnerDataById($uid, $check_valid = true) { - $r = DBA::fetchFirst( - "SELECT - `contact`.*, - `user`.`prvkey` AS `uprvkey`, - `user`.`timezone`, - `user`.`nickname`, - `user`.`sprvkey`, - `user`.`spubkey`, - `user`.`page-flags`, - `user`.`account-type`, - `user`.`prvnets`, - `user`.`account_removed`, - `user`.`hidewall` - FROM `contact` - INNER JOIN `user` - ON `user`.`uid` = `contact`.`uid` - WHERE `contact`.`uid` = ? - AND `contact`.`self` - LIMIT 1", - $uid - ); - if (!DBA::isResult($r)) { + $owner = DBA::selectFirst('owner-view', [], ['uid' => $uid]); + if (!DBA::isResult($owner)) { return false; } - if (empty($r['nickname'])) { + if (empty($owner['nickname'])) { return false; } if (!$check_valid) { - return $r; + return $owner; } // Check if the returned data is valid, otherwise fix it. See issue #6122 // Check for correct url and normalised nurl - $url = DI::baseUrl() . '/profile/' . $r['nickname']; - $repair = ($r['url'] != $url) || ($r['nurl'] != Strings::normaliseLink($r['url'])); + $url = DI::baseUrl() . '/profile/' . $owner['nickname']; + $repair = ($owner['url'] != $url) || ($owner['nurl'] != Strings::normaliseLink($owner['url'])); if (!$repair) { // Check if "addr" is present and correct - $addr = $r['nickname'] . '@' . substr(DI::baseUrl(), strpos(DI::baseUrl(), '://') + 3); - $repair = ($addr != $r['addr']); + $addr = $owner['nickname'] . '@' . substr(DI::baseUrl(), strpos(DI::baseUrl(), '://') + 3); + $repair = ($addr != $owner['addr']); } if (!$repair) { // Check if the avatar field is filled and the photo directs to the correct path $avatar = Photo::selectFirst(['resource-id'], ['uid' => $uid, 'profile' => true]); if (DBA::isResult($avatar)) { - $repair = empty($r['avatar']) || !strpos($r['photo'], $avatar['resource-id']); + $repair = empty($owner['avatar']) || !strpos($owner['photo'], $avatar['resource-id']); } } if ($repair) { Contact::updateSelfFromUserID($uid); // Return the corrected data and avoid a loop - $r = self::getOwnerDataById($uid, false); + $owner = self::getOwnerDataById($uid, false); } - return $r; + return $owner; } /** @@ -1290,17 +1270,10 @@ class User 'active_users_monthly' => 0, ]; - $userStmt = DBA::p("SELECT `user`.`uid`, `user`.`login_date`, `contact`.`last-item` - FROM `user` - INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self` - WHERE `user`.`verified` - AND `user`.`login_date` > ? - AND NOT `user`.`blocked` - AND NOT `user`.`account_removed` - AND NOT `user`.`account_expired`", - DBA::NULL_DATETIME - ); - + $userStmt = DBA::select('owner-view', ['uid', 'login_date', 'last-item'], + ["`verified` AND `login_date` > ? AND NOT `blocked` + AND NOT `account_removed` AND NOT `account_expired`", + DBA::NULL_DATETIME]); if (!DBA::isResult($userStmt)) { return $statistics; } @@ -1332,39 +1305,27 @@ class User * @param int $count Count of the items per page (Default is @see Pager::ITEMS_PER_PAGE) * @param string $type The type of users, which should get (all, bocked, removed) * @param string $order Order of the user list (Default is 'contact.name') - * @param string $order_direction Order direction (Default is ASC) + * @param bool $descending Order direction (Default is ascending) * * @return array The list of the users * @throws Exception */ - public static function getList($start = 0, $count = Pager::ITEMS_PER_PAGE, $type = 'all', $order = 'contact.name', $order_direction = '+') + public static function getList($start = 0, $count = Pager::ITEMS_PER_PAGE, $type = 'all', $order = 'name', bool $descending = false) { - $sql_order = '`' . str_replace('.', '`.`', $order) . '`'; - $sql_order_direction = ($order_direction === '+') ? 'ASC' : 'DESC'; - + $param = ['limit' => [$start, $count], 'order' => [$order => $descending]]; + $condition = []; switch ($type) { case 'active': - $sql_extra = 'AND `user`.`blocked` = 0'; + $condition['blocked'] = false; break; case 'blocked': - $sql_extra = 'AND `user`.`blocked` = 1'; + $condition['blocked'] = true; break; case 'removed': - $sql_extra = 'AND `user`.`account_removed` = 1'; - break; - case 'all': - default: - $sql_extra = ''; + $condition['account_removed'] = true; break; } - $usersStmt = DBA::p("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date`, `contact`.`nick`, `contact`.`created` - FROM `user` - INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self` - WHERE `user`.`verified` $sql_extra - ORDER BY $sql_order $sql_order_direction LIMIT ?, ?", $start, $count - ); - - return DBA::toArray($usersStmt); + return DBA::selectToArray('owner-view', [], $condition, $param); } } diff --git a/src/Module/Admin/Users.php b/src/Module/Admin/Users.php index 3ef91aadf7..822ac0c013 100644 --- a/src/Module/Admin/Users.php +++ b/src/Module/Admin/Users.php @@ -157,15 +157,15 @@ class Users extends BaseAdmin $pager = new Pager(DI::l10n(), DI::args()->getQueryString(), 100); $valid_orders = [ - 'contact.name', - 'user.email', - 'user.register_date', - 'user.login_date', + 'name', + 'email', + 'register_date', + 'login_date', 'lastitem_date', - 'user.page-flags' + 'page-flags' ]; - $order = 'contact.name'; + $order = 'name'; $order_direction = '+'; if (!empty($_GET['o'])) { $new_order = $_GET['o']; @@ -179,7 +179,7 @@ class Users extends BaseAdmin } } - $users = User::getList($pager->getStart(), $pager->getItemsPerPage(), 'all', $order, $order_direction); + $users = User::getList($pager->getStart(), $pager->getItemsPerPage(), 'all', $order, ($order_direction == '-')); $adminlist = explode(',', str_replace(' ', '', DI::config()->get('config', 'admin_email'))); $_setup_users = function ($e) use ($adminlist) { diff --git a/static/dbview.config.php b/static/dbview.config.php index ad33a78823..0d44df0311 100755 --- a/static/dbview.config.php +++ b/static/dbview.config.php @@ -53,5 +53,104 @@ return [ LEFT JOIN `tag` ON `post-tag`.`tid` = `tag`.`id` LEFT JOIN `contact` ON `post-tag`.`cid` = `contact`.`id`" ], + "owner-view" => [ + "fields" => [ + "id" => ["contact", "id"], + "uid" => ["contact", "uid"], + "created" => ["contact", "created"], + "updated" => ["contact", "updated"], + "self" => ["contact", "self"], + "remote_self" => ["contact", "remote_self"], + "rel" => ["contact", "rel"], + "duplex" => ["contact", "duplex"], + "network" => ["contact", "network"], + "protocol" => ["contact", "protocol"], + "name" => ["contact", "name"], + "nick" => ["contact", "nick"], + "location" => ["contact", "location"], + "about" => ["contact", "about"], + "keywords" => ["contact", "keywords"], + "gender" => ["contact", "gender"], + "xmpp" => ["contact", "xmpp"], + "attag" => ["contact", "attag"], + "avatar" => ["contact", "avatar"], + "photo" => ["contact", "photo"], + "thumb" => ["contact", "thumb"], + "micro" => ["contact", "micro"], + "site-pubkey" => ["contact", "site-pubkey"], + "issued-id" => ["contact", "issued-id"], + "dfrn-id" => ["contact", "dfrn-id"], + "url" => ["contact", "url"], + "nurl" => ["contact", "nurl"], + "addr" => ["contact", "addr"], + "alias" => ["contact", "alias"], + "pubkey" => ["contact", "pubkey"], + "prvkey" => ["contact", "prvkey"], + "batch" => ["contact", "batch"], + "request" => ["contact", "request"], + "notify" => ["contact", "notify"], + "poll" => ["contact", "poll"], + "confirm" => ["contact", "confirm"], + "poco" => ["contact", "poco"], + "aes_allow" => ["contact", "aes_allow"], + "ret-aes" => ["contact", "ret-aes"], + "usehub" => ["contact", "usehub"], + "subhub" => ["contact", "subhub"], + "hub-verify" => ["contact", "hub-verify"], + "last-update" => ["contact", "last-update"], + "success_update" => ["contact", "success_update"], + "failure_update" => ["contact", "failure_update"], + "name-date" => ["contact", "name-date"], + "uri-date" => ["contact", "uri-date"], + "avatar-date" => ["contact", "avatar-date"], + "term-date" => ["contact", "term-date"], + "last-item" => ["contact", "last-item"], + "lastitem_date" => ["contact", "last-item"], + "priority" => ["contact", "priority"], + "blocked" => ["contact", "blocked"], + "block_reason" => ["contact", "block_reason"], + "readonly" => ["contact", "readonly"], + "writable" => ["contact", "writable"], + "forum" => ["contact", "forum"], + "prv" => ["contact", "prv"], + "contact-type" => ["contact", "contact-type"], + "hidden" => ["contact", "hidden"], + "archive" => ["contact", "archive"], + "pending" => ["contact", "pending"], + "deleted" => ["contact", "deleted"], + "rating" => ["contact", "rating"], + "unsearchable" => ["contact", "unsearchable"], + "sensitive" => ["contact", "sensitive"], + "baseurl" => ["contact", "baseurl"], + "reason" => ["contact", "reason"], + "closeness" => ["contact", "closeness"], + "info" => ["contact", "info"], + "profile-id" => ["contact", "profile-id"], + "bdyear" => ["contact", "bdyear"], + "bd" => ["contact", "bd"], + "notify_new_posts" => ["notify_new_posts"], + "fetch_further_information" => ["fetch_further_information"], + "ffi_keyword_blacklist" => ["ffi_keyword_blacklist"], + "email" => ["user", "email"], + "uprvkey" => ["user", "prvkey"], + "timezone" => ["user", "timezone"], + "nickname" => ["user", "nickname"], + "sprvkey" => ["user", "sprvkey"], + "spubkey" => ["user", "spubkey"], + "page-flags" => ["user", "page-flags"], + "account-type" => ["user", "account-type"], + "prvnets" => ["user", "prvnets"], + "account_removed" => ["user", "account_removed"], + "hidewall" => ["user", "hidewall"], + "login_date" => ["user", "login_date"], + "register_date" => ["user", "register_date"], + "verified" => ["user", "verified"], + "account_removed" => ["user", "account_removed"], + "account_expired" => ["user", "account_expired"], + "account_expires_on" => ["user", "account_expires_on"], + ], + "query" => "FROM `user` + INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`" + ] ];