<?php
/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
namespace Friendica\Module\Api\Twitter;
+use Friendica\App;
use Friendica\Core\L10n;
-use Friendica\Database\DBA;
use Friendica\DI;
-use Friendica\Model\Profile;
use Friendica\Model\User;
+use Friendica\Module\Api\ApiResponse;
use Friendica\Module\BaseApi;
use Friendica\Model\Contact;
use Friendica\Network\HTTPException;
+use Friendica\Util\Profiler;
use Friendica\Util\Strings;
+use Psr\Log\LoggerInterface;
abstract class ContactEndpoint extends BaseApi
{
const DEFAULT_COUNT = 20;
const MAX_COUNT = 200;
- public function __construct(L10n $l10n, array $parameters = [])
+ public function __construct(App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, ApiResponse $response, array $server, array $parameters = [])
{
- parent::__construct($l10n, $parameters);
+ parent::__construct($app, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
self::checkAllowedScope(self::SCOPE_READ);
}
if (!$screen_name) {
$contact = Contact::getById($contact_id, ['nick', 'url']);
// We don't have the followers of remote accounts so we check for locality
- if (empty($contact) || !Strings::startsWith($contact['url'], DI::baseUrl()->get())) {
+ if (empty($contact) || !Strings::startsWith($contact['url'], DI::baseUrl())) {
throw new HTTPException\NotFoundException(DI::l10n()->t('Contact not found'));
}
/**
* This methods expands the contact ids into full user objects in an existing result set.
*
- * @param mixed $rel A relationship constant or a list of them
- * @param int $uid The local user id we query the contacts from
+ * @param array $ids List of contact ids
+ * @param int $total_count Total list of contacts
+ * @param int $uid The local user id we query the contacts from
* @param int $cursor
* @param int $count
* @param bool $skip_status
* @throws HTTPException\NotFoundException
* @throws \ImagickException
*/
- protected static function list($rel, int $uid, int $cursor = -1, int $count = self::DEFAULT_COUNT, bool $skip_status = false, bool $include_user_entities = true)
+ protected static function list(array $ids, int $total_count, int $uid, int $cursor = -1, int $count = self::DEFAULT_COUNT, bool $skip_status = false, bool $include_user_entities = true): array
{
- $return = self::ids($rel, $uid, $cursor, $count);
+ $return = self::ids($ids, $total_count, $cursor, $count, false);
$users = [];
foreach ($return['ids'] as $contactId) {
'next_cursor_str' => $return['next_cursor_str'],
'previous_cursor' => $return['previous_cursor'],
'previous_cursor_str' => $return['previous_cursor_str'],
- 'total_count' => (int)$return['total_count'],
+ 'total_count' => $return['total_count'],
];
return $return;
}
/**
- * @param mixed $rel A relationship constant or a list of them
- * @param int $uid The local user id we query the contacts from
+ * @param array $ids List of contact ids
+ * @param int $total_count Total list of contacts
* @param int $cursor
- * @param int $count
- * @param bool $stringify_ids
+ * @param int $count Number of elements to return
+ * @param bool $stringify_ids if "true" then the id is converted to a string
* @return array
* @throws HTTPException\NotFoundException
*/
- protected static function ids($rel, int $uid, int $cursor = -1, int $count = self::DEFAULT_COUNT, bool $stringify_ids = false)
+ protected static function ids(array $ids, int $total_count, int $cursor = -1, int $count = self::DEFAULT_COUNT, bool $stringify_ids = false): array
{
- $hide_friends = false;
- if ($uid != self::getCurrentUserID()) {
- $profile = Profile::getByUID($uid);
- if (empty($profile)) {
- throw new HTTPException\NotFoundException(DI::l10n()->t('Profile not found'));
- }
-
- $hide_friends = (bool)$profile['hide-friends'];
- }
-
- $ids = [];
$next_cursor = 0;
$previous_cursor = 0;
- $total_count = 0;
- if (!$hide_friends) {
- $condition = [
- 'rel' => $rel,
- 'uid' => $uid,
- 'self' => false,
- 'deleted' => false,
- 'hidden' => false,
- 'archive' => false,
- 'pending' => false
- ];
-
- $total_count = (int)DBA::count('contact', $condition);
-
- $params = ['limit' => $count, 'order' => ['id' => 'ASC']];
-
- if ($cursor !== -1) {
- if ($cursor > 0) {
- $condition = DBA::mergeConditions($condition, ['`id` > ?', $cursor]);
- } else {
- $condition = DBA::mergeConditions($condition, ['`id` < ?', -$cursor]);
- // Previous page case: we want the items closest to cursor but for that we need to reverse the query order
- $params['order']['id'] = 'DESC';
- }
- }
-
- $contacts = Contact::selectToArray(['id'], $condition, $params);
-
- // Previous page case: once we get the relevant items closest to cursor, we need to restore the expected display order
- if ($cursor !== -1 && $cursor <= 0) {
- $contacts = array_reverse($contacts);
- }
-
- // Contains user-specific contact ids
- $ids = array_column($contacts, 'id');
- // Cursor is on the user-specific contact id since it's the sort field
- if (count($ids)) {
- $previous_cursor = -$ids[0];
- $next_cursor = (int)$ids[count($ids) -1];
- }
+ // Cursor is on the user-specific contact id since it's the sort field
+ if (count($ids)) {
+ $previous_cursor = -$ids[0];
+ $next_cursor = (int)$ids[count($ids) -1];
+ }
- // No next page
- if ($total_count <= count($contacts) || count($contacts) < $count) {
- $next_cursor = 0;
- }
- // End of results
- if ($cursor < 0 && count($contacts) === 0) {
- $next_cursor = -1;
- }
+ // No next page
+ if ($total_count <= count($ids) || count($ids) < $count) {
+ $next_cursor = 0;
+ }
+ // End of results
+ if ($cursor < 0 && count($ids) === 0) {
+ $next_cursor = -1;
+ }
- // No previous page
- if ($cursor === -1) {
- $previous_cursor = 0;
- }
+ // No previous page
+ if ($cursor === -1) {
+ $previous_cursor = 0;
+ }
- if ($cursor > 0 && count($contacts) === 0) {
- $previous_cursor = -$cursor;
- }
+ if ($cursor > 0 && count($ids) === 0) {
+ $previous_cursor = -$cursor;
+ }
- if ($cursor < 0 && count($contacts) === 0) {
- $next_cursor = -1;
- }
+ if ($cursor < 0 && count($ids) === 0) {
+ $next_cursor = -1;
+ }
- // Conversion to public contact ids
- array_walk($ids, function (&$contactId) use ($uid, $stringify_ids) {
- $cdata = Contact::getPublicAndUserContactID($contactId, $uid);
- if ($stringify_ids) {
- $contactId = (string)$cdata['public'];
- } else {
- $contactId = (int)$cdata['public'];
- }
+ if ($stringify_ids) {
+ array_walk($ids, function (&$contactId) {
+ $contactId = (string)$contactId;
});
}