From b7cee324b0e4fe9048ffdee660cfc3a0f2dfd56a Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 3 Mar 2022 09:07:37 -0500 Subject: [PATCH] Add legacy notification endpoint for deprecated Notify entity - Add dependencies to Notifications\Notification module class --- mod/ping.php | 2 +- src/Module/Notifications/Notification.php | 144 +++++++++++++----- .../Notifications/Factory/FormattedNotify.php | 2 +- .../Notifications/Repository/Notify.php | 2 +- static/routes.config.php | 2 + tests/datasets/api.fixture.php | 8 +- .../Module/Api/Friendica/NotificationTest.php | 2 +- 7 files changed, 112 insertions(+), 50 deletions(-) diff --git a/mod/ping.php b/mod/ping.php index 1afab5f726..d5b43d6ea4 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -442,7 +442,7 @@ function ping_get_notifications($uid) DBA::update('notify', ['name_cache' => $notification["name"], 'msg_cache' => $notification["message"]], ['id' => $notification["id"]]); } - $notification["href"] = DI::baseUrl() . "/notification/" . $notification["id"]; + $notification["href"] = DI::baseUrl() . "/notify/" . $notification["id"]; if ($notification["visible"] && !$notification["deleted"] diff --git a/src/Module/Notifications/Notification.php b/src/Module/Notifications/Notification.php index d72e3c2502..a28b5d6f65 100644 --- a/src/Module/Notifications/Notification.php +++ b/src/Module/Notifications/Notification.php @@ -21,18 +21,45 @@ namespace Friendica\Module\Notifications; +use Friendica\App; use Friendica\BaseModule; +use Friendica\Contact\Introduction\Repository\Introduction; +use Friendica\Core\L10n; +use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues; use Friendica\Core\System; -use Friendica\DI; use Friendica\Model\Contact; +use Friendica\Module\Response; use Friendica\Module\Security\Login; +use Friendica\Navigation\Notifications\Factory; +use Friendica\Navigation\Notifications\Repository; use Friendica\Network\HTTPException; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; -/** - * Interacting with the /notification command - */ class Notification extends BaseModule { + /** @var Introduction */ + private $introductionRepo; + /** @var Repository\Notification */ + private $notificationRepo; + /** @var Repository\Notify */ + private $notifyRepo; + /** @var IManagePersonalConfigValues */ + private $pconfig; + /** @var Factory\Notification */ + private $notificationFactory; + + public function __construct(Introduction $introductionRepo, Repository\Notification $notificationRepo, Factory\Notification $notificationFactory, Repository\Notify $notifyRepo, IManagePersonalConfigValues $pconfig, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = []) + { + parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->introductionRepo = $introductionRepo; + $this->notificationRepo = $notificationRepo; + $this->notificationFactory = $notificationFactory; + $this->notifyRepo = $notifyRepo; + $this->pconfig = $pconfig; + } + /** * {@inheritDoc} * @@ -45,26 +72,26 @@ class Notification extends BaseModule protected function post(array $request = []) { if (!local_user()) { - throw new HTTPException\UnauthorizedException(DI::l10n()->t('Permission denied.')); + throw new HTTPException\UnauthorizedException($this->l10n->t('Permission denied.')); } $request_id = $this->parameters['id'] ?? false; if ($request_id) { - $intro = DI::intro()->selectOneById($request_id, local_user()); + $intro = $this->introductionRepo->selectOneById($request_id, local_user()); switch ($_POST['submit']) { - case DI::l10n()->t('Discard'): + case $this->l10n->t('Discard'): Contact\Introduction::discard($intro); - DI::intro()->delete($intro); + $this->introductionRepo->delete($intro); break; - case DI::l10n()->t('Ignore'): + case $this->l10n->t('Ignore'): $intro->ignore(); - DI::intro()->save($intro); + $this->introductionRepo->save($intro); break; } - DI::baseUrl()->redirect('notifications/intros'); + $this->baseUrl->redirect('notifications/intros'); } } @@ -76,15 +103,15 @@ class Notification extends BaseModule protected function rawContent(array $request = []) { if (!local_user()) { - throw new HTTPException\UnauthorizedException(DI::l10n()->t('Permission denied.')); + throw new HTTPException\UnauthorizedException($this->l10n->t('Permission denied.')); } - if (DI::args()->get(1) === 'mark' && DI::args()->get(2) === 'all') { + if ($this->args->get(1) === 'mark' && $this->args->get(2) === 'all') { try { - DI::notification()->setAllSeenForUser(local_user()); - $success = DI::notify()->setAllSeenForUser(local_user()); + $this->notificationRepo->setAllSeenForUser(local_user()); + $success = $this->notifyRepo->setAllSeenForUser(local_user()); } catch (\Exception $e) { - DI::logger()->warning('set all seen failed.', ['exception' => $e]); + $this->logger->warning('set all seen failed.', ['exception' => $e]); $success = false; } @@ -104,38 +131,71 @@ class Notification extends BaseModule protected function content(array $request = []): string { if (!local_user()) { - notice(DI::l10n()->t('You must be logged in to show this page.')); + notice($this->l10n->t('You must be logged in to show this page.')); return Login::form(); } - $request_id = $this->parameters['id'] ?? false; - - if ($request_id) { - $Notify = DI::notify()->selectOneById($request_id); - if ($Notify->uid !== local_user()) { - throw new HTTPException\ForbiddenException(); - } - - if (DI::pConfig()->get(local_user(), 'system', 'detailed_notif')) { - $Notify->setSeen(); - DI::notify()->save($Notify); - } else { - if ($Notify->uriId) { - DI::notification()->setAllSeenForUser($Notify->uid, ['target-uri-id' => $Notify->uriId]); - } - - DI::notify()->setAllSeenForRelatedNotify($Notify); - } - - if ((string)$Notify->link) { - System::externalRedirect($Notify->link); - } - - DI::baseUrl()->redirect(); + if (isset($this->parameters['notify_id'])) { + $this->handleNotify($this->parameters['notify_id']); + } elseif (isset($this->parameters['id'])) { + $this->handleNotification($this->parameters['id']); } - DI::baseUrl()->redirect('notifications/system'); + $this->baseUrl->redirect('notifications/system'); return ''; } + + private function handleNotify(int $notifyId) + { + $Notify = $this->notifyRepo->selectOneById($notifyId); + if ($Notify->uid !== local_user()) { + throw new HTTPException\ForbiddenException(); + } + + if ($this->pconfig->get(local_user(), 'system', 'detailed_notif')) { + $Notify->setSeen(); + $this->notifyRepo->save($Notify); + } else { + if ($Notify->uriId) { + $this->notificationRepo->setAllSeenForUser($Notify->uid, ['target-uri-id' => $Notify->uriId]); + } + + $this->notifyRepo->setAllSeenForRelatedNotify($Notify); + } + + if ((string)$Notify->link) { + System::externalRedirect($Notify->link); + } + + $this->baseUrl->redirect(); + } + + private function handleNotification(int $notificationId) + { + $Notification = $this->notificationRepo->selectOneById($notificationId); + if ($Notification->uid !== local_user()) { + throw new HTTPException\ForbiddenException(); + } + + if ($this->pconfig->get(local_user(), 'system', 'detailed_notif')) { + $Notification->setSeen(); + $this->notificationRepo->save($Notification); + } else { + if ($Notification->parentUriId) { + $this->notificationRepo->setAllSeenForUser($Notification->uid, ['parent-uri-id' => $Notification->parentUriId]); + } else { + $Notification->setSeen(); + $this->notificationRepo->save($Notification); + } + } + + $message = $this->notificationFactory->getMessageFromNotification($Notification); + + if ($message['link']) { + System::externalRedirect($message['link']); + } + + $this->baseUrl->redirect(); + } } diff --git a/src/Navigation/Notifications/Factory/FormattedNotify.php b/src/Navigation/Notifications/Factory/FormattedNotify.php index 2551de1a14..d4aba639c5 100644 --- a/src/Navigation/Notifications/Factory/FormattedNotify.php +++ b/src/Navigation/Notifications/Factory/FormattedNotify.php @@ -214,7 +214,7 @@ class FormattedNotify extends BaseFactory foreach ($Notifies as $Notify) { $formattedNotifications[] = new ValueObject\FormattedNotify( 'notification', - $this->baseUrl->get(true) . '/notification/' . $Notify->id, + $this->baseUrl->get(true) . '/notify/' . $Notify->id, Contact::getAvatarUrlForUrl($Notify->url, $Notify->uid, Proxy::SIZE_MICRO), $Notify->url, strip_tags(BBCode::toPlaintext($Notify->msg)), diff --git a/src/Navigation/Notifications/Repository/Notify.php b/src/Navigation/Notifications/Repository/Notify.php index eb65ed4a41..9773b6446a 100644 --- a/src/Navigation/Notifications/Repository/Notify.php +++ b/src/Navigation/Notifications/Repository/Notify.php @@ -570,7 +570,7 @@ class Notify extends BaseRepository $Notify->updateMsgFromPreamble($epreamble); $Notify = $this->save($Notify); - $itemlink = $this->baseUrl->get() . '/notification/' . $Notify->id; + $itemlink = $this->baseUrl->get() . '/notify/' . $Notify->id; $notify_id = $Notify->id; } diff --git a/static/routes.config.php b/static/routes.config.php index e10ec2aedf..bc3f15e4e1 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -449,6 +449,8 @@ return [ '/{id:\d+}' => [Module\Notifications\Notification::class, [R::GET, R::POST]], ], + '/notify/{notify_id:\d+}' => [Module\Notifications\Notification::class, [R::GET]], + '/oauth' => [ '/acknowledge' => [Module\OAuth\Acknowledge::class, [R::GET, R::POST]], '/authorize' => [Module\OAuth\Authorize::class, [R::GET]], diff --git a/tests/datasets/api.fixture.php b/tests/datasets/api.fixture.php index 1b52baa354..ace928b090 100644 --- a/tests/datasets/api.fixture.php +++ b/tests/datasets/api.fixture.php @@ -903,18 +903,18 @@ return [ [ 'id' => 1, 'type' => 8, - 'name' => 'Reply to', - 'url' => 'http://localhost/display/1', + 'name' => 'Friend contact', + 'url' => 'http://localhost/profile/friendcontact', 'photo' => 'http://localhost/', 'date' => '2020-01-01 12:12:02', 'msg' => 'A test reply from an item', 'uid' => 42, - 'link' => 'http://localhost/notification/1', + 'link' => 'http://localhost/display/1', 'iid' => 4, 'seen' => 0, 'verb' => \Friendica\Protocol\Activity::POST, 'otype' => Notification\ObjectType::ITEM, - 'name_cache' => 'Reply to', + 'name_cache' => 'Friend contact', 'msg_cache' => 'A test reply from an item', ], ], diff --git a/tests/src/Module/Api/Friendica/NotificationTest.php b/tests/src/Module/Api/Friendica/NotificationTest.php index 4e8509b4eb..3c17471b03 100644 --- a/tests/src/Module/Api/Friendica/NotificationTest.php +++ b/tests/src/Module/Api/Friendica/NotificationTest.php @@ -62,7 +62,7 @@ class NotificationTest extends ApiTest $assertXml = << - + XML;