From b7a460485a354ff11f25bcbf8a5ed7f87a6bfb62 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 16 Dec 2021 22:44:50 +0000 Subject: [PATCH 01/11] API: Direct Messages moved to new place --- include/api.php | 431 ------------------ src/DI.php | 8 + src/Factory/Api/Twitter/DirectMessage.php | 109 +++++ .../Api/Friendica/DirectMessages/Search.php | 69 +++ src/Module/Api/Twitter/ContactEndpoint.php | 2 - src/Module/Api/Twitter/DirectMessages/All.php | 39 ++ .../Twitter/DirectMessages/Conversation.php | 39 ++ .../Api/Twitter/DirectMessages/Destroy.php | 84 ++++ .../Api/Twitter/DirectMessages/Inbox.php | 43 ++ .../Api/Twitter/DirectMessages/NewDM.php | 77 ++++ .../Api/Twitter/DirectMessages/Sent.php | 43 ++ .../Api/Twitter/DirectMessagesEndpoint.php | 100 ++++ src/Object/Api/Twitter/DirectMessage.php | 104 +++++ static/routes.config.php | 14 +- tests/legacy/ApiTest.php | 82 ++-- 15 files changed, 778 insertions(+), 466 deletions(-) create mode 100644 src/Factory/Api/Twitter/DirectMessage.php create mode 100644 src/Module/Api/Friendica/DirectMessages/Search.php create mode 100644 src/Module/Api/Twitter/DirectMessages/All.php create mode 100644 src/Module/Api/Twitter/DirectMessages/Conversation.php create mode 100644 src/Module/Api/Twitter/DirectMessages/Destroy.php create mode 100644 src/Module/Api/Twitter/DirectMessages/Inbox.php create mode 100644 src/Module/Api/Twitter/DirectMessages/NewDM.php create mode 100644 src/Module/Api/Twitter/DirectMessages/Sent.php create mode 100644 src/Module/Api/Twitter/DirectMessagesEndpoint.php create mode 100644 src/Object/Api/Twitter/DirectMessage.php diff --git a/include/api.php b/include/api.php index 9b9850f6fa..4df1b7abae 100644 --- a/include/api.php +++ b/include/api.php @@ -144,60 +144,6 @@ function api_call($command, $extension) } } -/** - * - * @param array $item - * @param array $recipient - * @param array $sender - * - * @return array - * @throws InternalServerErrorException - */ -function api_format_messages($item, $recipient, $sender) -{ - // standard meta information - $ret = [ - 'id' => $item['id'], - 'sender_id' => $sender['id'], - 'text' => "", - 'recipient_id' => $recipient['id'], - 'created_at' => DateTimeFormat::utc($item['created'] ?? 'now', DateTimeFormat::API), - 'sender_screen_name' => $sender['screen_name'], - 'recipient_screen_name' => $recipient['screen_name'], - 'sender' => $sender, - 'recipient' => $recipient, - 'title' => "", - 'friendica_seen' => $item['seen'] ?? 0, - 'friendica_parent_uri' => $item['parent-uri'] ?? '', - ]; - - // "uid" is only needed for some internal stuff, so remove it from here - if (isset($ret['sender']['uid'])) { - unset($ret['sender']['uid']); - } - if (isset($ret['recipient']['uid'])) { - unset($ret['recipient']['uid']); - } - - //don't send title to regular StatusNET requests to avoid confusing these apps - if (!empty($_GET['getText'])) { - $ret['title'] = $item['title']; - if ($_GET['getText'] == 'html') { - $ret['text'] = BBCode::convertForUriId($item['uri-id'], $item['body'], BBCode::API); - } elseif ($_GET['getText'] == 'plain') { - $ret['text'] = trim(HTML::toPlaintext(BBCode::convertForUriId($item['uri-id'], api_clean_plain_items($item['body']), BBCode::API), 0)); - } - } else { - $ret['text'] = $item['title'] . "\n" . HTML::toPlaintext(BBCode::convertForUriId($item['uri-id'], api_clean_plain_items($item['body']), BBCode::API), 0); - } - if (!empty($_GET['getUserObjects']) && $_GET['getUserObjects'] == 'false') { - unset($ret['sender']); - unset($ret['recipient']); - } - - return $ret; -} - /** * * @param string $acl_string @@ -554,32 +500,6 @@ function prepare_photo_data($type, $scale, $photo_id, $uid) return $data; } -/** - * - * @param string $text - * - * @return string - * @throws InternalServerErrorException - */ -function api_clean_plain_items($text) -{ - $include_entities = strtolower($_REQUEST['include_entities'] ?? 'false'); - - $text = BBCode::cleanPictureLinks($text); - $URLSearchString = "^\[\]"; - - $text = preg_replace("/([!#@])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$1$3', $text); - - if ($include_entities == "true") { - $text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '[url=$1]$1[/url]', $text); - } - - // Simplify "attachment" element - $text = BBCode::removeAttachment($text); - - return $text; -} - /** * Add a new group to the database. * @@ -701,291 +621,6 @@ function api_lists_ownerships($type) api_register_func('api/lists/ownerships', 'api_lists_ownerships', true); -/** - * Sends a new direct message. - * - * @param string $type Return type (atom, rss, xml, json) - * - * @return array|string - * @throws BadRequestException - * @throws ForbiddenException - * @throws ImagickException - * @throws InternalServerErrorException - * @throws NotFoundException - * @throws UnauthorizedException - * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/new-message - */ -function api_direct_messages_new($type) -{ - BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); - $uid = BaseApi::getCurrentUserID(); - - if (empty($_POST["text"]) || empty($_REQUEST['screen_name']) && empty($_REQUEST['user_id'])) { - return; - } - - $sender = DI::twitterUser()->createFromUserId($uid, true)->toArray(); - - $cid = BaseApi::getContactIDForSearchterm($_REQUEST['screen_name'] ?? '', $_REQUEST['profileurl'] ?? '', $_REQUEST['user_id'] ?? 0, 0); - if (empty($cid)) { - throw new NotFoundException('Recipient not found'); - } - - $replyto = ''; - if (!empty($_REQUEST['replyto'])) { - $mail = DBA::selectFirst('mail', ['parent-uri', 'title'], ['uid' => $uid, 'id' => $_REQUEST['replyto']]); - $replyto = $mail['parent-uri']; - $sub = $mail['title']; - } else { - if (!empty($_REQUEST['title'])) { - $sub = $_REQUEST['title']; - } else { - $sub = ((strlen($_POST['text'])>10) ? substr($_POST['text'], 0, 10)."...":$_POST['text']); - } - } - - $cdata = Contact::getPublicAndUserContactID($cid, $uid); - - $id = Mail::send($cdata['user'], $_POST['text'], $sub, $replyto); - - if ($id > -1) { - $mail = DBA::selectFirst('mail', [], ['id' => $id]); - $ret = api_format_messages($mail, DI::twitterUser()->createFromContactId($cid, $uid, true)->toArray(), $sender); - } else { - $ret = ["error" => $id]; - } - - return DI::apiResponse()->formatData("direct-messages", $type, ['direct_message' => $ret], Contact::getPublicIdByUserId($uid)); -} - -api_register_func('api/direct_messages/new', 'api_direct_messages_new', true); - -/** - * delete a direct_message from mail table through api - * - * @param string $type Known types are 'atom', 'rss', 'xml' and 'json' - * @return string|array - * @throws BadRequestException - * @throws ForbiddenException - * @throws ImagickException - * @throws InternalServerErrorException - * @throws UnauthorizedException - * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/delete-message - */ -function api_direct_messages_destroy($type) -{ - BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); - $uid = BaseApi::getCurrentUserID(); - - //required - $id = $_REQUEST['id'] ?? 0; - // optional - $parenturi = $_REQUEST['friendica_parenturi'] ?? ''; - $verbose = (!empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false"); - /// @todo optional parameter 'include_entities' from Twitter API not yet implemented - - // error if no id or parenturi specified (for clients posting parent-uri as well) - if ($verbose == "true" && ($id == 0 || $parenturi == "")) { - $answer = ['result' => 'error', 'message' => 'message id or parenturi not specified']; - return DI::apiResponse()->formatData("direct_messages_delete", $type, ['$result' => $answer]); - } - - // BadRequestException if no id specified (for clients using Twitter API) - if ($id == 0) { - throw new BadRequestException('Message id not specified'); - } - - // add parent-uri to sql command if specified by calling app - $sql_extra = ($parenturi != "" ? " AND `parent-uri` = '" . DBA::escape($parenturi) . "'" : ""); - - // error message if specified id is not in database - if (!DBA::exists('mail', ["`uid` = ? AND `id` = ? " . $sql_extra, $uid, $id])) { - if ($verbose == "true") { - $answer = ['result' => 'error', 'message' => 'message id not in database']; - return DI::apiResponse()->formatData("direct_messages_delete", $type, ['$result' => $answer]); - } - /// @todo BadRequestException ok for Twitter API clients? - throw new BadRequestException('message id not in database'); - } - - // delete message - $result = DBA::delete('mail', ["`uid` = ? AND `id` = ? " . $sql_extra, $uid, $id]); - - if ($verbose == "true") { - if ($result) { - // return success - $answer = ['result' => 'ok', 'message' => 'message deleted']; - return DI::apiResponse()->formatData("direct_message_delete", $type, ['$result' => $answer]); - } else { - $answer = ['result' => 'error', 'message' => 'unknown error']; - return DI::apiResponse()->formatData("direct_messages_delete", $type, ['$result' => $answer]); - } - } - /// @todo return JSON data like Twitter API not yet implemented -} - -api_register_func('api/direct_messages/destroy', 'api_direct_messages_destroy', true); - -/** - * - * @param string $type Return type (atom, rss, xml, json) - * @param string $box - * @param string $verbose - * - * @return array|string - * @throws BadRequestException - * @throws ForbiddenException - * @throws ImagickException - * @throws InternalServerErrorException - * @throws UnauthorizedException - */ -function api_direct_messages_box($type, $box, $verbose) -{ - BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); - $uid = BaseApi::getCurrentUserID(); - - // params - $count = $_GET['count'] ?? 20; - $page = $_REQUEST['page'] ?? 1; - - $since_id = $_REQUEST['since_id'] ?? 0; - $max_id = $_REQUEST['max_id'] ?? 0; - - $user_id = $_REQUEST['user_id'] ?? ''; - $screen_name = $_REQUEST['screen_name'] ?? ''; - - $user_info = DI::twitterUser()->createFromUserId($uid, true)->toArray(); - - $profile_url = $user_info["url"]; - - // pagination - $start = max(0, ($page - 1) * $count); - - $sql_extra = ""; - - // filters - if ($box=="sentbox") { - $sql_extra = "`mail`.`from-url`='" . DBA::escape($profile_url) . "'"; - } elseif ($box == "conversation") { - $sql_extra = "`mail`.`parent-uri`='" . DBA::escape($_GET['uri'] ?? '') . "'"; - } elseif ($box == "all") { - $sql_extra = "true"; - } elseif ($box == "inbox") { - $sql_extra = "`mail`.`from-url`!='" . DBA::escape($profile_url) . "'"; - } - - if ($max_id > 0) { - $sql_extra .= ' AND `mail`.`id` <= ' . intval($max_id); - } - - if ($user_id != "") { - $sql_extra .= ' AND `mail`.`contact-id` = ' . intval($user_id); - } elseif ($screen_name !="") { - $sql_extra .= " AND `contact`.`nick` = '" . DBA::escape($screen_name). "'"; - } - - $r = DBA::toArray(DBA::p( - "SELECT `mail`.*, `contact`.`nurl` AS `contact-url` FROM `mail`,`contact` WHERE `mail`.`contact-id` = `contact`.`id` AND `mail`.`uid` = ? AND $sql_extra AND `mail`.`id` > ? ORDER BY `mail`.`id` DESC LIMIT ?,?", - $uid, - $since_id, - $start, - $count - )); - if ($verbose == "true" && !DBA::isResult($r)) { - $answer = ['result' => 'error', 'message' => 'no mails available']; - return DI::apiResponse()->formatData("direct_messages_all", $type, ['$result' => $answer]); - } - - $ret = []; - foreach ($r as $item) { - if ($box == "inbox" || $item['from-url'] != $profile_url) { - $recipient = $user_info; - $sender = DI::twitterUser()->createFromContactId($item['contact-id'], $uid, true)->toArray(); - } elseif ($box == "sentbox" || $item['from-url'] == $profile_url) { - $recipient = DI::twitterUser()->createFromContactId($item['contact-id'], $uid, true)->toArray(); - $sender = $user_info; - } - - if (isset($recipient) && isset($sender)) { - $ret[] = api_format_messages($item, $recipient, $sender); - } - } - - return DI::apiResponse()->formatData("direct-messages", $type, ['direct_message' => $ret], Contact::getPublicIdByUserId($uid)); -} - -/** - * Returns the most recent direct messages sent by the user. - * - * @param string $type Return type (atom, rss, xml, json) - * - * @return array|string - * @throws BadRequestException - * @throws ForbiddenException - * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/get-sent-message - */ -function api_direct_messages_sentbox($type) -{ - BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); - $verbose = !empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false"; - return api_direct_messages_box($type, "sentbox", $verbose); -} - -api_register_func('api/direct_messages/sent', 'api_direct_messages_sentbox', true); - -/** - * Returns the most recent direct messages sent to the user. - * - * @param string $type Return type (atom, rss, xml, json) - * - * @return array|string - * @throws BadRequestException - * @throws ForbiddenException - * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/get-messages - */ -function api_direct_messages_inbox($type) -{ - BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); - $verbose = !empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false"; - return api_direct_messages_box($type, "inbox", $verbose); -} - -api_register_func('api/direct_messages', 'api_direct_messages_inbox', true); - -/** - * - * @param string $type Return type (atom, rss, xml, json) - * - * @return array|string - * @throws BadRequestException - * @throws ForbiddenException - */ -function api_direct_messages_all($type) -{ - BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); - $verbose = !empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false"; - return api_direct_messages_box($type, "all", $verbose); -} - -api_register_func('api/direct_messages/all', 'api_direct_messages_all', true); - -/** - * - * @param string $type Return type (atom, rss, xml, json) - * - * @return array|string - * @throws BadRequestException - * @throws ForbiddenException - */ -function api_direct_messages_conversation($type) -{ - BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); - $verbose = !empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false"; - return api_direct_messages_box($type, "conversation", $verbose); -} - -api_register_func('api/direct_messages/conversation', 'api_direct_messages_conversation', true); - /** * list all photos of the authenticated user * @@ -1526,69 +1161,3 @@ function api_lists_update($type) } api_register_func('api/lists/update', 'api_lists_update', true); - -/** - * search for direct_messages containing a searchstring through api - * - * @param string $type Known types are 'atom', 'rss', 'xml' and 'json' - * @param string $box - * @return string|array (success: success=true if found and search_result contains found messages, - * success=false if nothing was found, search_result='nothing found', - * error: result=error with error message) - * @throws BadRequestException - * @throws ForbiddenException - * @throws ImagickException - * @throws InternalServerErrorException - * @throws UnauthorizedException - */ -function api_friendica_direct_messages_search($type, $box = "") -{ - BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); - $uid = BaseApi::getCurrentUserID(); - - // params - $user_info = DI::twitterUser()->createFromUserId($uid, true)->toArray(); - $searchstring = $_REQUEST['searchstring'] ?? ''; - - // error if no searchstring specified - if ($searchstring == "") { - $answer = ['result' => 'error', 'message' => 'searchstring not specified']; - return DI::apiResponse()->formatData("direct_messages_search", $type, ['$result' => $answer]); - } - - // get data for the specified searchstring - $r = DBA::toArray(DBA::p( - "SELECT `mail`.*, `contact`.`nurl` AS `contact-url` FROM `mail`,`contact` WHERE `mail`.`contact-id` = `contact`.`id` AND `mail`.`uid` = ? AND `body` LIKE ? ORDER BY `mail`.`id` DESC", - $uid, - '%'.$searchstring.'%' - )); - - $profile_url = $user_info["url"]; - - // message if nothing was found - if (!DBA::isResult($r)) { - $success = ['success' => false, 'search_results' => 'problem with query']; - } elseif (count($r) == 0) { - $success = ['success' => false, 'search_results' => 'nothing found']; - } else { - $ret = []; - foreach ($r as $item) { - if ($box == "inbox" || $item['from-url'] != $profile_url) { - $recipient = $user_info; - $sender = DI::twitterUser()->createFromContactId($item['contact-id'], $uid, true)->toArray(); - } elseif ($box == "sentbox" || $item['from-url'] == $profile_url) { - $recipient = DI::twitterUser()->createFromContactId($item['contact-id'], $uid, true)->toArray(); - $sender = $user_info; - } - - if (isset($recipient) && isset($sender)) { - $ret[] = api_format_messages($item, $recipient, $sender); - } - } - $success = ['success' => true, 'search_results' => $ret]; - } - - return DI::apiResponse()->formatData("direct_message_search", $type, ['$result' => $success]); -} - -api_register_func('api/friendica/direct_messages_search', 'api_friendica_direct_messages_search', true); diff --git a/src/DI.php b/src/DI.php index 190b46a05f..4f950bd78e 100644 --- a/src/DI.php +++ b/src/DI.php @@ -398,6 +398,14 @@ abstract class DI return self::$dice->create(Factory\Api\Twitter\User::class); } + /** + * @return Factory\Api\Twitter\DirectMessage + */ + public static function twitterDirectMessage() + { + return self::$dice->create(Factory\Api\Twitter\DirectMessage::class); + } + public static function notificationIntro(): Navigation\Notifications\Factory\Introduction { return self::$dice->create(Navigation\Notifications\Factory\Introduction::class); diff --git a/src/Factory/Api/Twitter/DirectMessage.php b/src/Factory/Api/Twitter/DirectMessage.php new file mode 100644 index 0000000000..b2f294a7f2 --- /dev/null +++ b/src/Factory/Api/Twitter/DirectMessage.php @@ -0,0 +1,109 @@ +. + * + */ + +namespace Friendica\Factory\Api\Twitter; + +use Friendica\BaseFactory; +use Friendica\Content\Text\BBCode; +use Friendica\Content\Text\HTML; +use Friendica\Database\Database; +use Friendica\Database\DBA; +use Friendica\Factory\Api\Friendica\Activities; +use Friendica\Factory\Api\Twitter\User as TwitterUser; +use Friendica\Model\Contact; +use Friendica\Network\HTTPException; +use Psr\Log\LoggerInterface; + +class DirectMessage extends BaseFactory +{ + /** @var Database */ + private $dba; + /** @var twitterUser entity */ + private $twitterUser; + /** @var Hashtag entity */ + private $hashtag; + /** @var Media entity */ + private $media; + /** @var Url entity */ + private $url; + /** @var Mention entity */ + private $mention; + /** @var Activities entity */ + private $activities; + /** @var Activities entity */ + private $attachment; + + public function __construct(LoggerInterface $logger, Database $dba, TwitterUser $twitteruser, Hashtag $hashtag, Media $media, Url $url, Mention $mention, Activities $activities, Attachment $attachment) + { + parent::__construct($logger); + $this->dba = $dba; + $this->twitterUser = $twitteruser; + $this->hashtag = $hashtag; + $this->media = $media; + $this->url = $url; + $this->mention = $mention; + $this->activities = $activities; + $this->attachment = $attachment; + } + + /** + * Create a direct message from a given mail id + * + * @todo Processing of "getUserObjects" (true/false) and "getText" (html/plain) + * + * @param int $id Mail id + * @param int $uid Mail user + * @param string $text_mode Either empty, "html" or "text" + * + * @return \Friendica\Object\Api\Twitter\DirectMessage + */ + public function createFromMailId(int $id, int $uid, string $text_mode = ''): \Friendica\Object\Api\Twitter\DirectMessage + { + $mail = DBA::selectFirst('mail', [], ['id' => $id, 'uid' => $uid]); + if (!$mail) { + throw new HTTPException\NotFoundException('Direct message with ID ' . $mail . ' not found.'); + } + + if (!empty($text_mode)) { + $title = $mail['title']; + if ($text_mode == 'html') { + $text = BBCode::convertForUriId($mail['uri-id'], $mail['body'], BBCode::API); + } elseif ($text_mode == 'plain') { + $text = HTML::toPlaintext(BBCode::convertForUriId($mail['uri-id'], $mail['body'], BBCode::API), 0); + } + } else { + $title = ''; + $text = $mail['title'] . "\n" . HTML::toPlaintext(BBCode::convertForUriId($mail['uri-id'], $mail['body'], BBCode::API), 0); + } + + $pcid = Contact::getPublicIdByUserId($uid); + + if ($mail['author-id'] == $pcid) { + $sender = $this->twitterUser->createFromUserId($uid, true); + $recipient = $this->twitterUser->createFromContactId($mail['contact-id'], $uid, true); + } else { + $sender = $this->twitterUser->createFromContactId($mail['author-id'], $uid, true); + $recipient = $this->twitterUser->createFromUserId($uid, true); + } + + return new \Friendica\Object\Api\Twitter\DirectMessage($mail, $sender, $recipient, $text, $title); + } +} diff --git a/src/Module/Api/Friendica/DirectMessages/Search.php b/src/Module/Api/Friendica/DirectMessages/Search.php new file mode 100644 index 0000000000..37cf7779b4 --- /dev/null +++ b/src/Module/Api/Friendica/DirectMessages/Search.php @@ -0,0 +1,69 @@ +. + * + */ + +namespace Friendica\Module\Api\Friendica\DirectMessages; + +use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Module\BaseApi; + +/** + * search for direct_messages containing a searchstring through api + * + * API endpoint: api/friendica/direct_messages_search + */ +class Search extends BaseApi +{ + protected function rawContent(array $request = []) + { + self::checkAllowedScope(self::SCOPE_READ); + $uid = self::getCurrentUserID(); + + $request = $this->getRequest([ + 'searchstring' => '', + ], $request); + + // error if no searchstring specified + if ($request['searchstring'] == '') { + $answer = ['result' => 'error', 'message' => 'searchstring not specified']; + $this->response->exit('direct_message_search', ['$result' => $answer], $this->parameters['extension'] ?? null); + exit; + } + + // get data for the specified searchstring + $mails = DBA::selectToArray('mail', ['id'], ["`uid` = ? AND `body` LIKE ?", $uid, '%' . $request['searchstring'] . '%'], ['order' => ['id' => true]]); + + // message if nothing was found + if (!DBA::isResult($mails)) { + $success = ['success' => false, 'search_results' => 'problem with query']; + } elseif (count($mails) == 0) { + $success = ['success' => false, 'search_results' => 'nothing found']; + } else { + $ret = []; + foreach ($mails as $mail) { + $ret[] = DI::twitterDirectMessage()->createFromMailId($mail['id'], $uid, $request['getText'] ?? ''); + } + $success = ['success' => true, 'search_results' => $ret]; + } + + $this->response->exit('direct_message_search', ['$result' => $success], $this->parameters['extension'] ?? null); + } +} diff --git a/src/Module/Api/Twitter/ContactEndpoint.php b/src/Module/Api/Twitter/ContactEndpoint.php index 541f7fd86d..10b2669dc6 100644 --- a/src/Module/Api/Twitter/ContactEndpoint.php +++ b/src/Module/Api/Twitter/ContactEndpoint.php @@ -23,9 +23,7 @@ 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; diff --git a/src/Module/Api/Twitter/DirectMessages/All.php b/src/Module/Api/Twitter/DirectMessages/All.php new file mode 100644 index 0000000000..c22112f7f5 --- /dev/null +++ b/src/Module/Api/Twitter/DirectMessages/All.php @@ -0,0 +1,39 @@ +. + * + */ + +namespace Friendica\Module\Api\Twitter\DirectMessages; + +use Friendica\Module\Api\Twitter\DirectMessagesEndpoint; +use Friendica\Module\BaseApi; + +/** + * Returns all direct messages + */ +class All extends DirectMessagesEndpoint +{ + protected function rawContent(array $request = []) + { + BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); + $uid = BaseApi::getCurrentUserID(); + + $this->getMessages($request, $uid, []); + } +} diff --git a/src/Module/Api/Twitter/DirectMessages/Conversation.php b/src/Module/Api/Twitter/DirectMessages/Conversation.php new file mode 100644 index 0000000000..83c8087d23 --- /dev/null +++ b/src/Module/Api/Twitter/DirectMessages/Conversation.php @@ -0,0 +1,39 @@ +. + * + */ + +namespace Friendica\Module\Api\Twitter\DirectMessages; + +use Friendica\Module\Api\Twitter\DirectMessagesEndpoint; +use Friendica\Module\BaseApi; + +/** + * Returns direct messages with a given URI + */ +class Conversation extends DirectMessagesEndpoint +{ + protected function rawContent(array $request = []) + { + BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); + $uid = BaseApi::getCurrentUserID(); + + $this->getMessages($request, $uid, ["`parent-uri` = ?", $request['uri'] ?? '']); + } +} diff --git a/src/Module/Api/Twitter/DirectMessages/Destroy.php b/src/Module/Api/Twitter/DirectMessages/Destroy.php new file mode 100644 index 0000000000..0c45408cbb --- /dev/null +++ b/src/Module/Api/Twitter/DirectMessages/Destroy.php @@ -0,0 +1,84 @@ +. + * + */ + +namespace Friendica\Module\Api\Twitter\DirectMessages; + +use Friendica\Database\DBA; +use Friendica\Module\BaseApi; +use Friendica\Network\HTTPException\BadRequestException; + +/** + * delete a direct_message from mail table through api + * + * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/delete-message + */ +class Destroy extends BaseApi +{ + protected function rawContent(array $request = []) + { + BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); + $uid = BaseApi::getCurrentUserID(); + + $id = filter_var($request['id'] ?? 0, FILTER_VALIDATE_INT); + $verbose = filter_var($request['friendica_verbose'] ?? false, FILTER_VALIDATE_BOOLEAN); + + $parenturi = $request['friendica_parenturi'] ?? ''; + + // error if no id or parenturi specified (for clients posting parent-uri as well) + if ($verbose && ($id == 0 || $parenturi == "")) { + $answer = ['result' => 'error', 'message' => 'message id or parenturi not specified']; + $this->response->exit('direct_messages_delete', ['direct_messages_delete' => $answer], $this->parameters['extension'] ?? null); + return; + } + + // BadRequestException if no id specified (for clients using Twitter API) + if ($id == 0) { + throw new BadRequestException('Message id not specified'); + } + + // add parent-uri to sql command if specified by calling app + $sql_extra = ($parenturi != "" ? " AND `parent-uri` = '" . DBA::escape($parenturi) . "'" : ""); + + // error message if specified id is not in database + if (!DBA::exists('mail', ["`uid` = ? AND `id` = ? " . $sql_extra, $uid, $id])) { + if ($verbose) { + $answer = ['result' => 'error', 'message' => 'message id not in database']; + $this->response->exit('direct_messages_delete', ['direct_messages_delete' => $answer], $this->parameters['extension'] ?? null); + return; + } + throw new BadRequestException('message id not in database'); + } + + // delete message + $result = DBA::delete('mail', ["`uid` = ? AND `id` = ? " . $sql_extra, $uid, $id]); + + if ($verbose) { + if ($result) { + // return success + $answer = ['result' => 'ok', 'message' => 'message deleted']; + $this->response->exit('direct_messages_delete', ['direct_messages_delete' => $answer], $this->parameters['extension'] ?? null); + } else { + $answer = ['result' => 'error', 'message' => 'unknown error']; + $this->response->exit('direct_messages_delete', ['direct_messages_delete' => $answer], $this->parameters['extension'] ?? null); + } + } + } +} diff --git a/src/Module/Api/Twitter/DirectMessages/Inbox.php b/src/Module/Api/Twitter/DirectMessages/Inbox.php new file mode 100644 index 0000000000..98da039869 --- /dev/null +++ b/src/Module/Api/Twitter/DirectMessages/Inbox.php @@ -0,0 +1,43 @@ +. + * + */ + +namespace Friendica\Module\Api\Twitter\DirectMessages; + +use Friendica\Model\Contact; +use Friendica\Module\Api\Twitter\DirectMessagesEndpoint; +use Friendica\Module\BaseApi; + +/** + * Returns the most recent direct messages sent to the user. + * + * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/get-messages + */ +class Inbox extends DirectMessagesEndpoint +{ + protected function rawContent(array $request = []) + { + BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); + $uid = BaseApi::getCurrentUserID(); + $pcid = Contact::getPublicIdByUserId($uid); + + $this->getMessages($request, $uid, ["`author-id` != ?", $pcid]); + } +} diff --git a/src/Module/Api/Twitter/DirectMessages/NewDM.php b/src/Module/Api/Twitter/DirectMessages/NewDM.php new file mode 100644 index 0000000000..64582b6a78 --- /dev/null +++ b/src/Module/Api/Twitter/DirectMessages/NewDM.php @@ -0,0 +1,77 @@ +. + * + */ + +namespace Friendica\Module\Api\Twitter\DirectMessages; + +use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Model\Contact; +use Friendica\Model\Mail; +use Friendica\Module\BaseApi; +use Friendica\Network\HTTPException\NotFoundException; + +/** + * Sends a new direct message. + * + * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/new-message + */ +class NewDM extends BaseApi +{ + protected function rawContent(array $request = []) + { + BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); + $uid = BaseApi::getCurrentUserID(); + + if (empty($request['text']) || empty($request['screen_name']) && empty($request['user_id'])) { + return; + } + + $cid = BaseApi::getContactIDForSearchterm($request['screen_name'] ?? '', $request['profileurl'] ?? '', $request['user_id'] ?? 0, 0); + if (empty($cid)) { + throw new NotFoundException('Recipient not found'); + } + + $replyto = ''; + if (!empty($request['replyto'])) { + $mail = DBA::selectFirst('mail', ['parent-uri', 'title'], ['uid' => $uid, 'id' => $request['replyto']]); + $replyto = $mail['parent-uri']; + $sub = $mail['title']; + } else { + if (!empty($request['title'])) { + $sub = $request['title']; + } else { + $sub = ((strlen($request['text']) > 10) ? substr($request['text'], 0, 10) . '...' : $request['text']); + } + } + + $cdata = Contact::getPublicAndUserContactID($cid, $uid); + + $id = Mail::send($cdata['user'], $request['text'], $sub, $replyto); + + if ($id > -1) { + $ret = DI::twitterDirectMessage()->createFromMailId($id, $uid, $request['getText'] ?? ''); + } else { + $ret = ['error' => $id]; + } + + $this->response->exit('direct-messages', ['direct_message' => $ret], $this->parameters['extension'] ?? null, Contact::getPublicIdByUserId($uid)); + } +} diff --git a/src/Module/Api/Twitter/DirectMessages/Sent.php b/src/Module/Api/Twitter/DirectMessages/Sent.php new file mode 100644 index 0000000000..da93727f61 --- /dev/null +++ b/src/Module/Api/Twitter/DirectMessages/Sent.php @@ -0,0 +1,43 @@ +. + * + */ + +namespace Friendica\Module\Api\Twitter\DirectMessages; + +use Friendica\Model\Contact; +use Friendica\Module\Api\Twitter\DirectMessagesEndpoint; +use Friendica\Module\BaseApi; + +/** + * Returns the most recent direct messages sent by the user. + * + * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/get-sent-message + */ +class Sent extends DirectMessagesEndpoint +{ + protected function rawContent(array $request = []) + { + BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); + $uid = BaseApi::getCurrentUserID(); + $pcid = Contact::getPublicIdByUserId($uid); + + $this->getMessages($request, $uid, ["`author-id` = ?", $pcid]); + } +} diff --git a/src/Module/Api/Twitter/DirectMessagesEndpoint.php b/src/Module/Api/Twitter/DirectMessagesEndpoint.php new file mode 100644 index 0000000000..7c0af120d9 --- /dev/null +++ b/src/Module/Api/Twitter/DirectMessagesEndpoint.php @@ -0,0 +1,100 @@ +. + * + */ + +namespace Friendica\Module\Api\Twitter; + +use Friendica\App; +use Friendica\Core\L10n; +use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Model\Contact; +use Friendica\Module\Api\ApiResponse; +use Friendica\Module\BaseApi; +use Friendica\Util\Profiler; +use Friendica\Factory\Api\Twitter\DirectMessage; +use Psr\Log\LoggerInterface; + +abstract class DirectMessagesEndpoint extends BaseApi +{ + /** + */ + protected function getMessages(array $request, int $uid, array $condition) + { + // params + $count = filter_var($request['count'] ?? 20, FILTER_VALIDATE_INT, ['options' => ['max_range' => 100]]); + $page = filter_var($request['page'] ?? 1, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]); + $since_id = filter_var($request['since_id'] ?? 0, FILTER_VALIDATE_INT); + $max_id = filter_var($request['max_id'] ?? 0, FILTER_VALIDATE_INT); + $min_id = filter_var($request['min_id'] ?? 0, FILTER_VALIDATE_INT); + $verbose = filter_var($request['friendica_verbose'] ?? false, FILTER_VALIDATE_BOOLEAN); + + // pagination + $start = max(0, ($page - 1) * $count); + + $params = ['order' => ['id' => true], 'limit' => [$start, $count]]; + + if (!empty($max_id)) { + $condition = DBA::mergeConditions($condition, ["`id` < ?", $max_id]); + } + + if (!empty($since_id)) { + $condition = DBA::mergeConditions($condition, ["`id` > ?", $since_id]); + } + + if (!empty($min_id)) { + $condition = DBA::mergeConditions($condition, ["`id` > ?", $min_id]); + + $params['order'] = ['id']; + } + + $cid = BaseApi::getContactIDForSearchterm($_REQUEST['screen_name'] ?? '', $_REQUEST['profileurl'] ?? '', $_REQUEST['user_id'] ?? 0, 0); + if (!empty($cid)) { + $cdata = Contact::getPublicAndUserContactID($cid, $uid); + if (!empty($cdata['user'])) { + $condition = DBA::mergeConditions($condition, ["`contact-id` = ?", $cdata['user']]); + } + } + + $condition = DBA::mergeConditions($condition, ["`uid` = ?", $uid]); + + $mails = DBA::selectToArray('mail', ['id'], $condition, $params); + if ($verbose && !DBA::isResult($mails)) { + $answer = ['result' => 'error', 'message' => 'no mails available']; + $this->response->exit('direct-messages', ['direct_message' => $answer], $this->parameters['extension'] ?? null); + exit; + } + + $ids = array_column($mails, 'id'); + + if (!empty($min_id)) { + $ids = array_reverse($ids); + } + + $ret = []; + foreach ($ids as $id) { + $ret[] = DI::twitterDirectMessage()->createFromMailId($id, $uid, $request['getText'] ?? ''); + } + + self::setLinkHeader(); + + $this->response->exit('direct-messages', ['direct_message' => $ret], $this->parameters['extension'] ?? null, Contact::getPublicIdByUserId($uid)); + } +} diff --git a/src/Object/Api/Twitter/DirectMessage.php b/src/Object/Api/Twitter/DirectMessage.php new file mode 100644 index 0000000000..04f34d2098 --- /dev/null +++ b/src/Object/Api/Twitter/DirectMessage.php @@ -0,0 +1,104 @@ +. + * + */ + +namespace Friendica\Object\Api\Twitter; + +use Friendica\BaseDataTransferObject; +use Friendica\Util\DateTimeFormat; + +/** + * Class DirectMessage + */ +class DirectMessage extends BaseDataTransferObject +{ + /** @var int */ + protected $id; + /** @var int */ + protected $sender_id; + /** @var string */ + protected $text; + /** @var int */ + protected $recipient_id; + /** @var string (Datetime) */ + protected $created_at; + /** @var string */ + protected $sender_screen_name = null; + /** @var string */ + protected $recipient_screen_name = null; + /** @var User */ + protected $sender; + /** @var User */ + protected $recipient; + /** @var string|null */ + protected $title; + /** @var bool */ + protected $friendica_seen; + /** @var string|null */ + protected $friendica_parent_uri = null; + + /** + * Creates a direct message record + * + * @param array $mail + * @param User $sender + * @param User $recipient + * @param string $text + * @param string $title + */ + public function __construct(array $mail, User $sender, User $recipient, string $text, string $title = null) + { + $this->id = (int)$mail['id']; + $this->created_at = DateTimeFormat::utc($mail['created'] ?? 'now', DateTimeFormat::API); + $this->title = $title; + $this->text = $text; + $this->sender = $sender->toArray(); + $this->recipient = $recipient->toArray(); + $this->sender_id = (int)$this->sender['id']; + $this->recipient_id = (int)$this->recipient['id']; + $this->sender_screen_name = $this->sender['screen_name']; + $this->recipient_screen_name = $this->recipient['screen_name']; + $this->friendica_seen = (bool)$mail['seen'] ?? false; + $this->friendica_parent_uri = $mail['parent-uri'] ?? ''; + } + + /** + * Returns the current entity as an array + * + * @return array + */ + public function toArray(): array + { + $status = parent::toArray(); + + if (is_null($status['title'])) { + unset($status['title']); + } + +/* if (isset($status['sender']['uid'])) { + unset($status['sender']['uid']); + } + if (isset($status['recipient']['uid'])) { + unset($status['recipient']['uid']); + } +*/ + return $status; + } +} diff --git a/static/routes.config.php b/static/routes.config.php index 905c3ddeb1..5a366e3704 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -52,13 +52,13 @@ $apiRoutes = [ '/blocks/list[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Blocks\Lists::class, [R::GET ]], '/conversation/show[.{extension:json|xml|rss|atom}]' => [Module\Api\GNUSocial\Statusnet\Conversation::class, [R::GET ]], '/direct_messages' => [ - '/all[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [R::GET ]], - '/conversation[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [R::GET ]], - '/destroy[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [ R::POST]], - '/new[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [ R::POST]], - '/sent[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [R::GET ]], + '/all[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\DirectMessages\All::class, [R::GET ]], + '/conversation[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\DirectMessages\Conversation::class, [R::GET ]], + '/destroy[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\DirectMessages\Destroy::class, [ R::POST]], + '/new[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\DirectMessages\NewDM::class, [ R::POST]], + '/sent[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\DirectMessages\Sent::class, [R::GET ]], ], - '/direct_messages[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [R::GET, R::POST]], + '/direct_messages[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\DirectMessages\Inbox::class, [R::GET, R::POST]], '/externalprofile/show[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Users\Show::class, [R::GET ]], '/favorites/create[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Favorites\Create::class, [ R::POST]], @@ -78,7 +78,7 @@ $apiRoutes = [ '/notification/seen[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Notification\Seen::class, [ R::POST]], '/notification[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Notification::class, [R::GET ]], '/direct_messages_setseen[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\DirectMessages\Setseen::class, [ R::POST]], - '/direct_messages_search[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [R::GET ]], + '/direct_messages_search[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\DirectMessages\Search ::class, [R::GET ]], '/events[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Index::class, [R::GET ]], '/group_show[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [R::GET ]], '/group_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [ R::POST]], diff --git a/tests/legacy/ApiTest.php b/tests/legacy/ApiTest.php index f469217de4..53c9cc6e14 100644 --- a/tests/legacy/ApiTest.php +++ b/tests/legacy/ApiTest.php @@ -842,6 +842,7 @@ class ApiTest extends FixtureTest */ public function testApiFormatMessages() { + /* $result = api_format_messages( ['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'], ['id' => 2, 'uri-id' => 2, 'screen_name' => 'recipient_name'], @@ -853,6 +854,7 @@ class ApiTest extends FixtureTest self::assertEquals(3, $result['sender_id']); self::assertEquals('recipient_name', $result['recipient_screen_name']); self::assertEquals('sender_name', $result['sender_screen_name']); + */ } /** @@ -862,6 +864,7 @@ class ApiTest extends FixtureTest */ public function testApiFormatMessagesWithHtmlText() { + /* $_GET['getText'] = 'html'; $result = api_format_messages( ['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'], @@ -870,6 +873,7 @@ class ApiTest extends FixtureTest ); self::assertEquals('item_title', $result['title']); self::assertEquals('item_body', $result['text']); + */ } /** @@ -879,6 +883,7 @@ class ApiTest extends FixtureTest */ public function testApiFormatMessagesWithPlainText() { + /* $_GET['getText'] = 'plain'; $result = api_format_messages( ['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'], @@ -887,6 +892,7 @@ class ApiTest extends FixtureTest ); self::assertEquals('item_title', $result['title']); self::assertEquals('item_body', $result['text']); + */ } /** @@ -896,6 +902,7 @@ class ApiTest extends FixtureTest */ public function testApiFormatMessagesWithoutUserObjects() { + /* $_GET['getUserObjects'] = 'false'; $result = api_format_messages( ['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'], @@ -904,6 +911,7 @@ class ApiTest extends FixtureTest ); self::assertTrue(!isset($result['sender'])); self::assertTrue(!isset($result['recipient'])); + */ } /** @@ -1189,8 +1197,8 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesNew() { - $result = api_direct_messages_new('json'); - self::assertNull($result); + //$result = api_direct_messages_new('json'); + //self::assertNull($result); } /** @@ -1200,10 +1208,12 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesNewWithoutAuthenticatedUser() { + /* $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); BasicAuth::setCurrentUserID(); $_SESSION['authenticated'] = false; api_direct_messages_new('json'); + */ } /** @@ -1213,10 +1223,12 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesNewWithUserId() { + /* $_POST['text'] = 'message_text'; $_REQUEST['user_id'] = $this->otherUser['id']; $result = api_direct_messages_new('json'); self::assertEquals(['direct_message' => ['error' => -1]], $result); + */ } /** @@ -1226,6 +1238,7 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesNewWithScreenName() { + /* $this->app->setLoggedInUserNickname($this->selfUser['nick']); $_POST['text'] = 'message_text'; $_REQUEST['user_id'] = $this->friendUser['id']; @@ -1233,6 +1246,7 @@ class ApiTest extends FixtureTest self::assertStringContainsString('message_text', $result['direct_message']['text']); self::assertEquals('selfcontact', $result['direct_message']['sender_screen_name']); self::assertEquals(1, $result['direct_message']['friendica_seen']); + */ } /** @@ -1242,6 +1256,7 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesNewWithTitle() { + /* $this->app->setLoggedInUserNickname($this->selfUser['nick']); $_POST['text'] = 'message_text'; $_REQUEST['user_id'] = $this->friendUser['id']; @@ -1251,6 +1266,7 @@ class ApiTest extends FixtureTest self::assertStringContainsString('message_title', $result['direct_message']['text']); self::assertEquals('selfcontact', $result['direct_message']['sender_screen_name']); self::assertEquals(1, $result['direct_message']['friendica_seen']); + */ } /** @@ -1260,11 +1276,13 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesNewWithRss() { + /* $this->app->setLoggedInUserNickname($this->selfUser['nick']); $_POST['text'] = 'message_text'; $_REQUEST['user_id'] = $this->friendUser['id']; $result = api_direct_messages_new('rss'); self::assertXml($result, 'direct-messages'); + */ } /** @@ -1274,8 +1292,8 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesDestroy() { - $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); - api_direct_messages_destroy('json'); + //$this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); + //api_direct_messages_destroy('json'); } /** @@ -1285,6 +1303,7 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesDestroyWithVerbose() { + /* $_GET['friendica_verbose'] = 'true'; $result = api_direct_messages_destroy('json'); self::assertEquals( @@ -1296,6 +1315,7 @@ class ApiTest extends FixtureTest ], $result ); + */ } /** @@ -1305,10 +1325,12 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesDestroyWithoutAuthenticatedUser() { + /* $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); BasicAuth::setCurrentUserID(); $_SESSION['authenticated'] = false; api_direct_messages_destroy('json'); + */ } /** @@ -1318,9 +1340,11 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesDestroyWithId() { + /* $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); $_REQUEST['id'] = 1; api_direct_messages_destroy('json'); + */ } /** @@ -1330,6 +1354,7 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesDestroyWithIdAndVerbose() { + /* $_REQUEST['id'] = 1; $_REQUEST['friendica_parenturi'] = 'parent_uri'; $_GET['friendica_verbose'] = 'true'; @@ -1343,6 +1368,7 @@ class ApiTest extends FixtureTest ], $result ); + */ } /** @@ -1362,10 +1388,12 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesBoxWithSentbox() { + /* $_REQUEST['page'] = -1; $_REQUEST['max_id'] = 10; $result = api_direct_messages_box('json', 'sentbox', 'false'); self::assertArrayHasKey('direct_message', $result); + */ } /** @@ -1375,8 +1403,8 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesBoxWithConversation() { - $result = api_direct_messages_box('json', 'conversation', 'false'); - self::assertArrayHasKey('direct_message', $result); + //$result = api_direct_messages_box('json', 'conversation', 'false'); + //self::assertArrayHasKey('direct_message', $result); } /** @@ -1386,8 +1414,8 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesBoxWithAll() { - $result = api_direct_messages_box('json', 'all', 'false'); - self::assertArrayHasKey('direct_message', $result); + //$result = api_direct_messages_box('json', 'all', 'false'); + //self::assertArrayHasKey('direct_message', $result); } /** @@ -1397,8 +1425,8 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesBoxWithInbox() { - $result = api_direct_messages_box('json', 'inbox', 'false'); - self::assertArrayHasKey('direct_message', $result); + //$result = api_direct_messages_box('json', 'inbox', 'false'); + //self::assertArrayHasKey('direct_message', $result); } /** @@ -1408,6 +1436,7 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesBoxWithVerbose() { + /* $result = api_direct_messages_box('json', 'sentbox', 'true'); self::assertEquals( [ @@ -1418,6 +1447,7 @@ class ApiTest extends FixtureTest ], $result ); + */ } /** @@ -1427,8 +1457,8 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesBoxWithRss() { - $result = api_direct_messages_box('rss', 'sentbox', 'false'); - self::assertXml($result, 'direct-messages'); + //$result = api_direct_messages_box('rss', 'sentbox', 'false'); + //self::assertXml($result, 'direct-messages'); } /** @@ -1438,9 +1468,9 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesBoxWithUnallowedUser() { - $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); - BasicAuth::setCurrentUserID(); - api_direct_messages_box('json', 'sentbox', 'false'); + //$this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); + //BasicAuth::setCurrentUserID(); + //api_direct_messages_box('json', 'sentbox', 'false'); } /** @@ -1450,8 +1480,8 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesSentbox() { - $result = api_direct_messages_sentbox('json'); - self::assertArrayHasKey('direct_message', $result); + //$result = api_direct_messages_sentbox('json'); + //self::assertArrayHasKey('direct_message', $result); } /** @@ -1461,8 +1491,8 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesInbox() { - $result = api_direct_messages_inbox('json'); - self::assertArrayHasKey('direct_message', $result); + //$result = api_direct_messages_inbox('json'); + //self::assertArrayHasKey('direct_message', $result); } /** @@ -1472,8 +1502,8 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesAll() { - $result = api_direct_messages_all('json'); - self::assertArrayHasKey('direct_message', $result); + //$result = api_direct_messages_all('json'); + //self::assertArrayHasKey('direct_message', $result); } /** @@ -1483,8 +1513,8 @@ class ApiTest extends FixtureTest */ public function testApiDirectMessagesConversation() { - $result = api_direct_messages_conversation('json'); - self::assertArrayHasKey('direct_message', $result); + //$result = api_direct_messages_conversation('json'); + //self::assertArrayHasKey('direct_message', $result); } /** @@ -1746,9 +1776,9 @@ class ApiTest extends FixtureTest */ public function testApiCleanPlainItems() { - $_REQUEST['include_entities'] = 'true'; - $result = api_clean_plain_items('some_text [url="some_url"]some_text[/url]'); - self::assertEquals('some_text [url="some_url"]"some_url"[/url]', $result); + //$_REQUEST['include_entities'] = 'true'; + //$result = api_clean_plain_items('some_text [url="some_url"]some_text[/url]'); + //self::assertEquals('some_text [url="some_url"]"some_url"[/url]', $result); } /** From fd63421dde16d5322de8748029b4e306caaa9543 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 16 Dec 2021 22:51:47 +0000 Subject: [PATCH 02/11] Standards --- .../Api/Twitter/DirectMessagesEndpoint.php | 19 ++++++------------- src/Object/Api/Twitter/DirectMessage.php | 4 ++-- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/Module/Api/Twitter/DirectMessagesEndpoint.php b/src/Module/Api/Twitter/DirectMessagesEndpoint.php index 7c0af120d9..674bc0a74c 100644 --- a/src/Module/Api/Twitter/DirectMessagesEndpoint.php +++ b/src/Module/Api/Twitter/DirectMessagesEndpoint.php @@ -21,17 +21,10 @@ namespace Friendica\Module\Api\Twitter; -use Friendica\App; -use Friendica\Core\L10n; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Contact; -use Friendica\Module\Api\ApiResponse; use Friendica\Module\BaseApi; -use Friendica\Util\Profiler; -use Friendica\Factory\Api\Twitter\DirectMessage; -use Psr\Log\LoggerInterface; - abstract class DirectMessagesEndpoint extends BaseApi { /** @@ -39,17 +32,17 @@ abstract class DirectMessagesEndpoint extends BaseApi protected function getMessages(array $request, int $uid, array $condition) { // params - $count = filter_var($request['count'] ?? 20, FILTER_VALIDATE_INT, ['options' => ['max_range' => 100]]); - $page = filter_var($request['page'] ?? 1, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]); - $since_id = filter_var($request['since_id'] ?? 0, FILTER_VALIDATE_INT); - $max_id = filter_var($request['max_id'] ?? 0, FILTER_VALIDATE_INT); - $min_id = filter_var($request['min_id'] ?? 0, FILTER_VALIDATE_INT); + $count = filter_var($request['count'] ?? 20, FILTER_VALIDATE_INT, ['options' => ['max_range' => 100]]); + $page = filter_var($request['page'] ?? 1, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]); + $since_id = filter_var($request['since_id'] ?? 0, FILTER_VALIDATE_INT); + $max_id = filter_var($request['max_id'] ?? 0, FILTER_VALIDATE_INT); + $min_id = filter_var($request['min_id'] ?? 0, FILTER_VALIDATE_INT); $verbose = filter_var($request['friendica_verbose'] ?? false, FILTER_VALIDATE_BOOLEAN); // pagination $start = max(0, ($page - 1) * $count); - $params = ['order' => ['id' => true], 'limit' => [$start, $count]]; + $params = ['order' => ['id' => true], 'limit' => [$start, $count]]; if (!empty($max_id)) { $condition = DBA::mergeConditions($condition, ["`id` < ?", $max_id]); diff --git a/src/Object/Api/Twitter/DirectMessage.php b/src/Object/Api/Twitter/DirectMessage.php index 04f34d2098..7c69b82a32 100644 --- a/src/Object/Api/Twitter/DirectMessage.php +++ b/src/Object/Api/Twitter/DirectMessage.php @@ -92,13 +92,13 @@ class DirectMessage extends BaseDataTransferObject unset($status['title']); } -/* if (isset($status['sender']['uid'])) { + if (isset($status['sender']['uid'])) { unset($status['sender']['uid']); } if (isset($status['recipient']['uid'])) { unset($status['recipient']['uid']); } -*/ + return $status; } } From c18bda9397d0ea9d68ea7a81e6292459317fdbf5 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 16 Dec 2021 22:54:48 +0000 Subject: [PATCH 03/11] Standards --- src/Factory/Api/Twitter/DirectMessage.php | 2 +- src/Module/Api/Twitter/DirectMessages/All.php | 2 +- src/Module/Api/Twitter/DirectMessages/Conversation.php | 2 +- src/Module/Api/Twitter/DirectMessages/Destroy.php | 2 +- src/Module/Api/Twitter/DirectMessagesEndpoint.php | 1 + 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Factory/Api/Twitter/DirectMessage.php b/src/Factory/Api/Twitter/DirectMessage.php index b2f294a7f2..9ee655f04e 100644 --- a/src/Factory/Api/Twitter/DirectMessage.php +++ b/src/Factory/Api/Twitter/DirectMessage.php @@ -91,7 +91,7 @@ class DirectMessage extends BaseFactory } } else { $title = ''; - $text = $mail['title'] . "\n" . HTML::toPlaintext(BBCode::convertForUriId($mail['uri-id'], $mail['body'], BBCode::API), 0); + $text = $mail['title'] . "\n" . HTML::toPlaintext(BBCode::convertForUriId($mail['uri-id'], $mail['body'], BBCode::API), 0); } $pcid = Contact::getPublicIdByUserId($uid); diff --git a/src/Module/Api/Twitter/DirectMessages/All.php b/src/Module/Api/Twitter/DirectMessages/All.php index c22112f7f5..406e81174e 100644 --- a/src/Module/Api/Twitter/DirectMessages/All.php +++ b/src/Module/Api/Twitter/DirectMessages/All.php @@ -32,7 +32,7 @@ class All extends DirectMessagesEndpoint protected function rawContent(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); - $uid = BaseApi::getCurrentUserID(); + $uid = BaseApi::getCurrentUserID(); $this->getMessages($request, $uid, []); } diff --git a/src/Module/Api/Twitter/DirectMessages/Conversation.php b/src/Module/Api/Twitter/DirectMessages/Conversation.php index 83c8087d23..2467409860 100644 --- a/src/Module/Api/Twitter/DirectMessages/Conversation.php +++ b/src/Module/Api/Twitter/DirectMessages/Conversation.php @@ -32,7 +32,7 @@ class Conversation extends DirectMessagesEndpoint protected function rawContent(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); - $uid = BaseApi::getCurrentUserID(); + $uid = BaseApi::getCurrentUserID(); $this->getMessages($request, $uid, ["`parent-uri` = ?", $request['uri'] ?? '']); } diff --git a/src/Module/Api/Twitter/DirectMessages/Destroy.php b/src/Module/Api/Twitter/DirectMessages/Destroy.php index 0c45408cbb..c289864f20 100644 --- a/src/Module/Api/Twitter/DirectMessages/Destroy.php +++ b/src/Module/Api/Twitter/DirectMessages/Destroy.php @@ -37,7 +37,7 @@ class Destroy extends BaseApi BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); - $id = filter_var($request['id'] ?? 0, FILTER_VALIDATE_INT); + $id = filter_var($request['id'] ?? 0, FILTER_VALIDATE_INT); $verbose = filter_var($request['friendica_verbose'] ?? false, FILTER_VALIDATE_BOOLEAN); $parenturi = $request['friendica_parenturi'] ?? ''; diff --git a/src/Module/Api/Twitter/DirectMessagesEndpoint.php b/src/Module/Api/Twitter/DirectMessagesEndpoint.php index 674bc0a74c..d0390fa0e8 100644 --- a/src/Module/Api/Twitter/DirectMessagesEndpoint.php +++ b/src/Module/Api/Twitter/DirectMessagesEndpoint.php @@ -25,6 +25,7 @@ use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Contact; use Friendica\Module\BaseApi; + abstract class DirectMessagesEndpoint extends BaseApi { /** From 85d68a001ab7ebbdf6d42c585bfdc116f8b27ac5 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Fri, 17 Dec 2021 15:48:03 +0100 Subject: [PATCH 04/11] Update src/Object/Api/Twitter/DirectMessage.php Co-authored-by: Hypolite Petovan --- src/Object/Api/Twitter/DirectMessage.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Object/Api/Twitter/DirectMessage.php b/src/Object/Api/Twitter/DirectMessage.php index 7c69b82a32..d34ef46b51 100644 --- a/src/Object/Api/Twitter/DirectMessage.php +++ b/src/Object/Api/Twitter/DirectMessage.php @@ -92,12 +92,8 @@ class DirectMessage extends BaseDataTransferObject unset($status['title']); } - if (isset($status['sender']['uid'])) { - unset($status['sender']['uid']); - } - if (isset($status['recipient']['uid'])) { - unset($status['recipient']['uid']); - } + unset($status['sender']['uid']); + unset($status['recipient']['uid']); return $status; } From e9ca41b6f02ae2dd90debaa956c89541fd0a5825 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 17 Dec 2021 14:55:16 +0000 Subject: [PATCH 05/11] Added documentation --- src/Module/Api/Twitter/DirectMessagesEndpoint.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Module/Api/Twitter/DirectMessagesEndpoint.php b/src/Module/Api/Twitter/DirectMessagesEndpoint.php index d0390fa0e8..4f1897d630 100644 --- a/src/Module/Api/Twitter/DirectMessagesEndpoint.php +++ b/src/Module/Api/Twitter/DirectMessagesEndpoint.php @@ -29,6 +29,11 @@ use Friendica\Module\BaseApi; abstract class DirectMessagesEndpoint extends BaseApi { /** + * Handles a direct messages endpoint with the given condition + * + * @param array $request + * @param int $uid + * @param array $condition */ protected function getMessages(array $request, int $uid, array $condition) { From 1110f4abf726e5c4f79b08fbc2a15bd54d25745a Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 17 Dec 2021 15:27:38 +0000 Subject: [PATCH 06/11] Fixes space --- src/Module/Api/Twitter/DirectMessagesEndpoint.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Module/Api/Twitter/DirectMessagesEndpoint.php b/src/Module/Api/Twitter/DirectMessagesEndpoint.php index 4f1897d630..ba45e0ab49 100644 --- a/src/Module/Api/Twitter/DirectMessagesEndpoint.php +++ b/src/Module/Api/Twitter/DirectMessagesEndpoint.php @@ -30,7 +30,7 @@ abstract class DirectMessagesEndpoint extends BaseApi { /** * Handles a direct messages endpoint with the given condition - * + * * @param array $request * @param int $uid * @param array $condition From 23f8d37bcd0c291a45ad07f1c17ef386496dd203 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 19 Dec 2021 07:39:39 +0000 Subject: [PATCH 07/11] Use dynamic function --- src/Factory/Api/Twitter/DirectMessage.php | 24 ++--------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/src/Factory/Api/Twitter/DirectMessage.php b/src/Factory/Api/Twitter/DirectMessage.php index 9ee655f04e..f2a4771d37 100644 --- a/src/Factory/Api/Twitter/DirectMessage.php +++ b/src/Factory/Api/Twitter/DirectMessage.php @@ -25,8 +25,6 @@ use Friendica\BaseFactory; use Friendica\Content\Text\BBCode; use Friendica\Content\Text\HTML; use Friendica\Database\Database; -use Friendica\Database\DBA; -use Friendica\Factory\Api\Friendica\Activities; use Friendica\Factory\Api\Twitter\User as TwitterUser; use Friendica\Model\Contact; use Friendica\Network\HTTPException; @@ -38,30 +36,12 @@ class DirectMessage extends BaseFactory private $dba; /** @var twitterUser entity */ private $twitterUser; - /** @var Hashtag entity */ - private $hashtag; - /** @var Media entity */ - private $media; - /** @var Url entity */ - private $url; - /** @var Mention entity */ - private $mention; - /** @var Activities entity */ - private $activities; - /** @var Activities entity */ - private $attachment; - public function __construct(LoggerInterface $logger, Database $dba, TwitterUser $twitteruser, Hashtag $hashtag, Media $media, Url $url, Mention $mention, Activities $activities, Attachment $attachment) + public function __construct(LoggerInterface $logger, Database $dba, TwitterUser $twitteruser) { parent::__construct($logger); $this->dba = $dba; $this->twitterUser = $twitteruser; - $this->hashtag = $hashtag; - $this->media = $media; - $this->url = $url; - $this->mention = $mention; - $this->activities = $activities; - $this->attachment = $attachment; } /** @@ -77,7 +57,7 @@ class DirectMessage extends BaseFactory */ public function createFromMailId(int $id, int $uid, string $text_mode = ''): \Friendica\Object\Api\Twitter\DirectMessage { - $mail = DBA::selectFirst('mail', [], ['id' => $id, 'uid' => $uid]); + $mail = $this->dba->selectFirst('mail', [], ['id' => $id, 'uid' => $uid]); if (!$mail) { throw new HTTPException\NotFoundException('Direct message with ID ' . $mail . ' not found.'); } From 465ee3718d489d96f32a6821566025941594856b Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 19 Dec 2021 08:22:16 +0000 Subject: [PATCH 08/11] Use dynamic functions --- .../Api/Friendica/DirectMessages/Search.php | 28 ++++++++++++++--- .../Api/Twitter/DirectMessagesEndpoint.php | 30 +++++++++++++++---- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/Module/Api/Friendica/DirectMessages/Search.php b/src/Module/Api/Friendica/DirectMessages/Search.php index 37cf7779b4..c0322a95ec 100644 --- a/src/Module/Api/Friendica/DirectMessages/Search.php +++ b/src/Module/Api/Friendica/DirectMessages/Search.php @@ -21,9 +21,15 @@ namespace Friendica\Module\Api\Friendica\DirectMessages; +use Friendica\App; +use Friendica\Core\L10n; +use Friendica\Database\Database; use Friendica\Database\DBA; -use Friendica\DI; +use Friendica\Factory\Api\Twitter\DirectMessage; +use Friendica\Module\Api\ApiResponse; use Friendica\Module\BaseApi; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; /** * search for direct_messages containing a searchstring through api @@ -32,6 +38,20 @@ use Friendica\Module\BaseApi; */ class Search extends BaseApi { + /** @var Database */ + private $dba; + + /** @var DirectMessage */ + private $directMessage; + + public function __construct(DirectMessage $directMessage, Database $dba, App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, ApiResponse $response, array $server, array $parameters = []) + { + parent::__construct($app, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->dba = $dba; + $this->directMessage = $directMessage; + } + protected function rawContent(array $request = []) { self::checkAllowedScope(self::SCOPE_READ); @@ -45,11 +65,11 @@ class Search extends BaseApi if ($request['searchstring'] == '') { $answer = ['result' => 'error', 'message' => 'searchstring not specified']; $this->response->exit('direct_message_search', ['$result' => $answer], $this->parameters['extension'] ?? null); - exit; + return; } // get data for the specified searchstring - $mails = DBA::selectToArray('mail', ['id'], ["`uid` = ? AND `body` LIKE ?", $uid, '%' . $request['searchstring'] . '%'], ['order' => ['id' => true]]); + $mails = $this->dba->selectToArray('mail', ['id'], ["`uid` = ? AND `body` LIKE ?", $uid, '%' . $request['searchstring'] . '%'], ['order' => ['id' => true]]); // message if nothing was found if (!DBA::isResult($mails)) { @@ -59,7 +79,7 @@ class Search extends BaseApi } else { $ret = []; foreach ($mails as $mail) { - $ret[] = DI::twitterDirectMessage()->createFromMailId($mail['id'], $uid, $request['getText'] ?? ''); + $ret[] = $this->directMessage->createFromMailId($mail['id'], $uid, $request['getText'] ?? ''); } $success = ['success' => true, 'search_results' => $ret]; } diff --git a/src/Module/Api/Twitter/DirectMessagesEndpoint.php b/src/Module/Api/Twitter/DirectMessagesEndpoint.php index ba45e0ab49..0a51b0cbfc 100644 --- a/src/Module/Api/Twitter/DirectMessagesEndpoint.php +++ b/src/Module/Api/Twitter/DirectMessagesEndpoint.php @@ -21,13 +21,33 @@ namespace Friendica\Module\Api\Twitter; +use Friendica\App; +use Friendica\Core\L10n; +use Friendica\Database\Database; use Friendica\Database\DBA; -use Friendica\DI; +use Friendica\Factory\Api\Twitter\DirectMessage; use Friendica\Model\Contact; +use Friendica\Module\Api\ApiResponse; use Friendica\Module\BaseApi; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; abstract class DirectMessagesEndpoint extends BaseApi { + /** @var Database */ + private $dba; + + /** @var DirectMessage */ + private $directMessage; + + public function __construct(DirectMessage $directMessage, Database $dba, App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, ApiResponse $response, array $server, array $parameters = []) + { + parent::__construct($app, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->dba = $dba; + $this->directMessage = $directMessage; + } + /** * Handles a direct messages endpoint with the given condition * @@ -64,7 +84,7 @@ abstract class DirectMessagesEndpoint extends BaseApi $params['order'] = ['id']; } - $cid = BaseApi::getContactIDForSearchterm($_REQUEST['screen_name'] ?? '', $_REQUEST['profileurl'] ?? '', $_REQUEST['user_id'] ?? 0, 0); + $cid = BaseApi::getContactIDForSearchterm($request['screen_name'] ?? '', $request['profileurl'] ?? '', $_REQUEST['user_id'] ?? 0, 0); if (!empty($cid)) { $cdata = Contact::getPublicAndUserContactID($cid, $uid); if (!empty($cdata['user'])) { @@ -74,11 +94,11 @@ abstract class DirectMessagesEndpoint extends BaseApi $condition = DBA::mergeConditions($condition, ["`uid` = ?", $uid]); - $mails = DBA::selectToArray('mail', ['id'], $condition, $params); + $mails = $this->dba->selectToArray('mail', ['id'], $condition, $params); if ($verbose && !DBA::isResult($mails)) { $answer = ['result' => 'error', 'message' => 'no mails available']; $this->response->exit('direct-messages', ['direct_message' => $answer], $this->parameters['extension'] ?? null); - exit; + return; } $ids = array_column($mails, 'id'); @@ -89,7 +109,7 @@ abstract class DirectMessagesEndpoint extends BaseApi $ret = []; foreach ($ids as $id) { - $ret[] = DI::twitterDirectMessage()->createFromMailId($id, $uid, $request['getText'] ?? ''); + $ret[] = $this->directMessage->createFromMailId($id, $uid, $request['getText'] ?? ''); } self::setLinkHeader(); From 2ee5745d3c6f27168bb42f62fd9614189dc1e356 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 19 Dec 2021 08:32:19 +0000 Subject: [PATCH 09/11] Use dynamic functions --- .../Api/Twitter/DirectMessages/Destroy.php | 19 +++++++++++-- .../Api/Twitter/DirectMessages/NewDM.php | 27 ++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/Module/Api/Twitter/DirectMessages/Destroy.php b/src/Module/Api/Twitter/DirectMessages/Destroy.php index c289864f20..0d697de448 100644 --- a/src/Module/Api/Twitter/DirectMessages/Destroy.php +++ b/src/Module/Api/Twitter/DirectMessages/Destroy.php @@ -21,9 +21,15 @@ namespace Friendica\Module\Api\Twitter\DirectMessages; +use Friendica\App; +use Friendica\Core\L10n; +use Friendica\Database\Database; use Friendica\Database\DBA; +use Friendica\Module\Api\ApiResponse; use Friendica\Module\BaseApi; use Friendica\Network\HTTPException\BadRequestException; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; /** * delete a direct_message from mail table through api @@ -32,6 +38,15 @@ use Friendica\Network\HTTPException\BadRequestException; */ class Destroy extends BaseApi { + /** @var Database */ + private $dba; + + public function __construct(Database $dba, App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, ApiResponse $response, array $server, array $parameters = []) + { + parent::__construct($app, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->dba = $dba; + } protected function rawContent(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); @@ -58,7 +73,7 @@ class Destroy extends BaseApi $sql_extra = ($parenturi != "" ? " AND `parent-uri` = '" . DBA::escape($parenturi) . "'" : ""); // error message if specified id is not in database - if (!DBA::exists('mail', ["`uid` = ? AND `id` = ? " . $sql_extra, $uid, $id])) { + if (!$this->dba->exists('mail', ["`uid` = ? AND `id` = ? " . $sql_extra, $uid, $id])) { if ($verbose) { $answer = ['result' => 'error', 'message' => 'message id not in database']; $this->response->exit('direct_messages_delete', ['direct_messages_delete' => $answer], $this->parameters['extension'] ?? null); @@ -68,7 +83,7 @@ class Destroy extends BaseApi } // delete message - $result = DBA::delete('mail', ["`uid` = ? AND `id` = ? " . $sql_extra, $uid, $id]); + $result = $this->dba->delete('mail', ["`uid` = ? AND `id` = ? " . $sql_extra, $uid, $id]); if ($verbose) { if ($result) { diff --git a/src/Module/Api/Twitter/DirectMessages/NewDM.php b/src/Module/Api/Twitter/DirectMessages/NewDM.php index 64582b6a78..8df6c5ec06 100644 --- a/src/Module/Api/Twitter/DirectMessages/NewDM.php +++ b/src/Module/Api/Twitter/DirectMessages/NewDM.php @@ -21,12 +21,17 @@ namespace Friendica\Module\Api\Twitter\DirectMessages; -use Friendica\Database\DBA; -use Friendica\DI; +use Friendica\App; +use Friendica\Core\L10n; +use Friendica\Database\Database; +use Friendica\Factory\Api\Twitter\DirectMessage; use Friendica\Model\Contact; use Friendica\Model\Mail; +use Friendica\Module\Api\ApiResponse; use Friendica\Module\BaseApi; use Friendica\Network\HTTPException\NotFoundException; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; /** * Sends a new direct message. @@ -35,6 +40,20 @@ use Friendica\Network\HTTPException\NotFoundException; */ class NewDM extends BaseApi { + /** @var Database */ + private $dba; + + /** @var DirectMessage */ + private $directMessage; + + public function __construct(DirectMessage $directMessage, Database $dba, App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, ApiResponse $response, array $server, array $parameters = []) + { + parent::__construct($app, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->dba = $dba; + $this->directMessage = $directMessage; + } + protected function rawContent(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); @@ -51,7 +70,7 @@ class NewDM extends BaseApi $replyto = ''; if (!empty($request['replyto'])) { - $mail = DBA::selectFirst('mail', ['parent-uri', 'title'], ['uid' => $uid, 'id' => $request['replyto']]); + $mail = $this->dba->selectFirst('mail', ['parent-uri', 'title'], ['uid' => $uid, 'id' => $request['replyto']]); $replyto = $mail['parent-uri']; $sub = $mail['title']; } else { @@ -67,7 +86,7 @@ class NewDM extends BaseApi $id = Mail::send($cdata['user'], $request['text'], $sub, $replyto); if ($id > -1) { - $ret = DI::twitterDirectMessage()->createFromMailId($id, $uid, $request['getText'] ?? ''); + $ret = $this->directMessage->createFromMailId($id, $uid, $request['getText'] ?? ''); } else { $ret = ['error' => $id]; } From c5969de66d2be3025245ee6dc3fd24805e205a55 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 20 Dec 2021 19:36:45 +0000 Subject: [PATCH 10/11] Unused function removed --- src/DI.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/DI.php b/src/DI.php index 4f950bd78e..190b46a05f 100644 --- a/src/DI.php +++ b/src/DI.php @@ -398,14 +398,6 @@ abstract class DI return self::$dice->create(Factory\Api\Twitter\User::class); } - /** - * @return Factory\Api\Twitter\DirectMessage - */ - public static function twitterDirectMessage() - { - return self::$dice->create(Factory\Api\Twitter\DirectMessage::class); - } - public static function notificationIntro(): Navigation\Notifications\Factory\Introduction { return self::$dice->create(Navigation\Notifications\Factory\Introduction::class); From 5d69f7411dad575789def59bc8ef0cd8823af809 Mon Sep 17 00:00:00 2001 From: Philipp Date: Mon, 27 Dec 2021 20:02:37 +0100 Subject: [PATCH 11/11] Add MessageDirect\Search tests --- .../Api/Friendica/DirectMessages/Search.php | 2 - tests/datasets/mail/mail.fixture.php | 17 ++++ .../Friendica/DirectMessages/SearchTest.php | 84 +++++++++++++++++++ 3 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 tests/datasets/mail/mail.fixture.php create mode 100644 tests/src/Module/Api/Friendica/DirectMessages/SearchTest.php diff --git a/src/Module/Api/Friendica/DirectMessages/Search.php b/src/Module/Api/Friendica/DirectMessages/Search.php index c0322a95ec..679accb33a 100644 --- a/src/Module/Api/Friendica/DirectMessages/Search.php +++ b/src/Module/Api/Friendica/DirectMessages/Search.php @@ -73,8 +73,6 @@ class Search extends BaseApi // message if nothing was found if (!DBA::isResult($mails)) { - $success = ['success' => false, 'search_results' => 'problem with query']; - } elseif (count($mails) == 0) { $success = ['success' => false, 'search_results' => 'nothing found']; } else { $ret = []; diff --git a/tests/datasets/mail/mail.fixture.php b/tests/datasets/mail/mail.fixture.php new file mode 100644 index 0000000000..215356beaa --- /dev/null +++ b/tests/datasets/mail/mail.fixture.php @@ -0,0 +1,17 @@ + [ + [ + 'uid' => 42, + 'author-id' => 44, + 'uri-id' => 44, + 'parent-uri-id' => 44, + 'thr-parent-id' => 44, + 'guid' => '123456', + 'from-name' => 'Tester', + 'title' => 'test message', + 'body' => 'this is a test', + ], + ], +]; diff --git a/tests/src/Module/Api/Friendica/DirectMessages/SearchTest.php b/tests/src/Module/Api/Friendica/DirectMessages/SearchTest.php new file mode 100644 index 0000000000..c66a1f42ed --- /dev/null +++ b/tests/src/Module/Api/Friendica/DirectMessages/SearchTest.php @@ -0,0 +1,84 @@ +. + * + */ + +namespace Friendica\Test\src\Module\Api\Friendica\DirectMessages; + +use Friendica\App\Router; +use Friendica\DI; +use Friendica\Factory\Api\Twitter\DirectMessage; +use Friendica\Module\Api\Friendica\DirectMessages\Search; +use Friendica\Test\src\Module\Api\ApiTest; +use Psr\Log\NullLogger; + +class SearchTest extends ApiTest +{ + public function testEmpty() + { + $directMessage = new DirectMessage(new NullLogger(), DI::dba(), DI::twitterUser()); + + $response = (new Search($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]))->run(); + + $json = $this->toJson($response); + + $assert = new \stdClass(); + $assert->result = 'error'; + $assert->message = 'searchstring not specified'; + + self::assertEquals($assert, $json); + } + + public function testMail() + { + $this->loadFixture(__DIR__ . '/../../../../../datasets/mail/mail.fixture.php', DI::dba()); + + $directMessage = new DirectMessage(new NullLogger(), DI::dba(), DI::twitterUser()); + + $search = new Search($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $response = $search->run(['searchstring' => 'test']); + + $json = $this->toJson($response); + + self::assertTrue($json->success); + + foreach ($json->search_results as $searchResult) { + self::assertIsObject($searchResult->sender); + self::assertIsInt($searchResult->id); + self::assertIsInt($searchResult->sender_id); + self::assertIsObject($searchResult->recipient); + } + } + + public function testNothingFound() + { + $directMessage = new DirectMessage(new NullLogger(), DI::dba(), DI::twitterUser()); + + $search = new Search($directMessage, DI::dba(), DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::GET]); + $response = $search->run(['searchstring' => 'test']); + + $json = $this->toJson($response); + + $assert = new \stdClass(); + $assert->success = false; + $assert->search_results = 'nothing found'; + + self::assertEquals($assert, $json); + } +}