diff --git a/src/Collection/FSuggests.php b/src/Collection/FSuggests.php new file mode 100644 index 000000000..4ab51b648 --- /dev/null +++ b/src/Collection/FSuggests.php @@ -0,0 +1,10 @@ +create(Repository\FSuggest::class); + } + /** * @return Repository\Introduction */ diff --git a/src/Model/FSuggest.php b/src/Model/FSuggest.php new file mode 100644 index 000000000..e7b8df7e2 --- /dev/null +++ b/src/Model/FSuggest.php @@ -0,0 +1,22 @@ +t('Permission denied.')); + } + } + + public static function post(array $parameters = []) + { + $cid = intval($parameters['contact']); + + // We do query the "uid" as well to ensure that it is our contact + if (!DI::dba()->exists('contact', ['id' => $cid, 'uid' => local_user()])) { + throw new NotFoundException(DI::l10n()->t('Contact not found.')); + } + + $suggest_contact_id = intval($_POST['suggest']); + if (empty($suggest_contact_id)) { + return; + } + + // We do query the "uid" as well to ensure that it is our contact + $contact = DI::dba()->selectFirst('contact', ['name', 'url', 'request', 'avatar'], ['id' => $suggest_contact_id, 'uid' => local_user()]); + if (empty($contact)) { + notice(DI::l10n()->t('Suggested contact not found.')); + return; + } + + $note = Strings::escapeHtml(trim($_POST['note'] ?? '')); + + $suggest = DI::fsuggest()->insert([ + 'uid' => local_user(), + 'cid' => $cid, + 'name' => $contact['name'], + 'url' => $contact['url'], + 'request' => $contact['request'], + 'photo' => $contact['avatar'], + 'note' => $note, + 'created' => DateTimeFormat::utcNow() + ]); + + Worker::add(PRIORITY_HIGH, 'Notifier', Delivery::SUGGESTION, $suggest->id); + + info(DI::l10n()->t('Friend suggestion sent.')); + } + + public static function content(array $parameters = []) + { + $cid = intval($parameters['contact']); + + $contact = DI::dba()->selectFirst('contact', [], ['id' => $cid, 'uid' => local_user()]); + if (empty($contact)) { + notice(DI::l10n()->t('Contact not found.')); + DI::baseUrl()->redirect(); + } + + $stmtContacts = ContactModel::select(['id', 'name'], [ + '`uid` = ? AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND NOT `deleted` AND `notify` != "" AND `id` != ? AND `networks` = ?', + local_user(), + $cid, + Protocol::DFRN, + ]); + + $formattedContacts = []; + + while ($contact = DI::dba()->fetch($stmtContacts)) { + $formattedContacts[$contact['id']] = $contact['name']; + } + + $tpl = Renderer::getMarkupTemplate('fsuggest.tpl'); + return Renderer::replaceMacros($tpl, [ + '$contact_id' => $cid, + '$fsuggest_title' => DI::l10n()->t('Suggest Friends'), + '$fsuggest_select' => [ + 'suggest', + DI::l10n()->t('Suggest a friend for %s', $contact['name']), + '', + '', + $formattedContacts, + ], + '$submit' => DI::l10n()->t('Submit'), + ]); + } +} diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index 23301456a..1883fb162 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -1510,14 +1510,14 @@ class Transmitter { $owner = User::getOwnerDataById($uid); - $suggestion = DBA::selectFirst('fsuggest', ['url', 'note', 'created'], ['id' => $suggestion_id]); + $suggestion = DI::fsuggest()->getById($suggestion_id); $data = ['@context' => ActivityPub::CONTEXT, 'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'type' => 'Announce', 'actor' => $owner['url'], - 'object' => $suggestion['url'], - 'content' => $suggestion['note'], + 'object' => $suggestion->url, + 'content' => $suggestion->note, 'instrument' => self::getService(), 'to' => [ActivityPub::PUBLIC_COLLECTION], 'cc' => []]; diff --git a/src/Repository/FSuggest.php b/src/Repository/FSuggest.php new file mode 100644 index 000000000..4567f0a5a --- /dev/null +++ b/src/Repository/FSuggest.php @@ -0,0 +1,74 @@ +dba, $this->logger, $data); + } + + /** + * Returns the Friend Suggest based on it's ID + * + * @param int $id The id of the fsuggest + * + * @return Model\FSuggest + * + * @throws \Friendica\Network\HTTPException\NotFoundException + */ + public function getById(int $id) + { + return $this->selectFirst(['id' => $id]); + } + + /** + * @param array $condition + * @return Model\FSuggest + * @throws \Friendica\Network\HTTPException\NotFoundException + */ + public function selectFirst(array $condition) + { + return parent::selectFirst($condition); + } + + /** + * @param array $condition + * @param array $params + * @return Collection\FSuggests + * @throws \Exception + */ + public function select(array $condition = [], array $params = []) + { + return parent::select($condition, $params); + } + + /** + * @param array $condition + * @param array $params + * @param int|null $max_id + * @param int|null $since_id + * @param int $limit + * @return Collection\FSuggests + * @throws \Exception + */ + public function selectByBoundaries(array $condition = [], array $params = [], int $max_id = null, int $since_id = null, int $limit = self::LIMIT) + { + return parent::selectByBoundaries($condition, $params, $max_id, $since_id, $limit); + } +} diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index d8c424ed0..d611c54c9 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -70,12 +70,12 @@ class Notifier 'APDelivery', $cmd, $target_id, $inbox, $uid); } } elseif ($cmd == Delivery::SUGGESTION) { - $suggest = DBA::selectFirst('fsuggest', ['uid', 'cid'], ['id' => $target_id]); - if (!DBA::isResult($suggest)) { + $suggest = DI::fsuggest()->getById($target_id); + if (empty($suggest)) { return; } - $uid = $suggest['uid']; - $recipients[] = $suggest['cid']; + $uid = $suggest->uid; + $recipients[] = $suggest->cid; } elseif ($cmd == Delivery::REMOVAL) { return self::notifySelfRemoval($target_id, $a->queue['priority'], $a->queue['created']); } elseif ($cmd == Delivery::RELOCATION) { diff --git a/static/routes.config.php b/static/routes.config.php index 4aad69d8c..f3e8fdf83 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -128,6 +128,7 @@ return [ '/followers/{owner}' => [Module\Followers::class, [R::GET]], '/following/{owner}' => [Module\Following::class, [R::GET]], '/friendica[/json]' => [Module\Friendica::class, [R::GET]], + '/fsuggest/{contact}' => [Module\FriendSuggest::class, [R::GET, R::POST]], '/group' => [ '[/]' => [Module\Group::class, [R::GET, R::POST]], diff --git a/view/templates/fsuggest.tpl b/view/templates/fsuggest.tpl new file mode 100644 index 000000000..b6ee1fcb3 --- /dev/null +++ b/view/templates/fsuggest.tpl @@ -0,0 +1,9 @@ +