diff --git a/include/api.php b/include/api.php index 3f4d5625b..c9402d46d 100644 --- a/include/api.php +++ b/include/api.php @@ -5957,11 +5957,11 @@ function api_friendica_notification_seen($type) $id = (!empty($_REQUEST['id']) ? intval($_REQUEST['id']) : 0); try { - $notification = DI::notify()->getByID($id); - $notification->setSeen(); + $notify = DI::notify()->getByID($id); + DI::notify()->setSeen(true, $notify); - if ($notification->otype === Notify::OTYPE_ITEM) { - $item = Item::selectFirstForUser(api_user(), [], ['id' => $notification->iid, 'uid' => api_user()]); + if ($notify->otype === Notify::OTYPE_ITEM) { + $item = Item::selectFirstForUser(api_user(), [], ['id' => $notify->iid, 'uid' => api_user()]); if (DBA::isResult($item)) { // we found the item, return it to the user $ret = api_format_items([$item], $user_info, false, $type); @@ -5972,7 +5972,9 @@ function api_friendica_notification_seen($type) } return api_format_data('result', $type, ['result' => "success"]); } catch (NotFoundException $e) { - throw new BadRequestException('Invalid argument'); + throw new BadRequestException('Invalid argument', $e); + } catch (Exception $e) { + throw new InternalServerErrorException('Internal Server exception', $e); } } diff --git a/src/Model/Notify.php b/src/Model/Notify.php index b12eb341b..35d72384e 100644 --- a/src/Model/Notify.php +++ b/src/Model/Notify.php @@ -2,7 +2,6 @@ namespace Friendica\Model; -use Exception; use Friendica\BaseModel; use Friendica\Content\Text\BBCode; use Friendica\Database\Database; @@ -50,24 +49,6 @@ class Notify extends BaseModel $this->setMsgCache(); } - /** - * Set the notification as seen - * - * @param bool $seen true, if seen - * - * @return bool True, if the seen state could be saved - */ - public function setSeen(bool $seen = true) - { - $this->seen = $seen; - try { - return $this->repo->update($this); - } catch (Exception $e) { - $this->logger->warning('Update failed.', ['$this' => $this, 'exception' => $e]); - return false; - } - } - /** * Sets the pre-formatted name (caching) */ diff --git a/src/Module/Notifications/Notification.php b/src/Module/Notifications/Notification.php index 6df58374e..34ab3d5ac 100644 --- a/src/Module/Notifications/Notification.php +++ b/src/Module/Notifications/Notification.php @@ -44,8 +44,8 @@ class Notification extends BaseModule // @TODO: Replace with parameter from router if (DI::args()->get(1) === 'mark' && DI::args()->get(2) === 'all') { try { - $success = DI::notify()->setAllSeen(); - }catch (\Exception $e) { + $success = DI::notify()->setSeen(); + } catch (\Exception $e) { DI::logger()->warning('set all seen failed.', ['exception' => $e]); $success = false; } @@ -66,11 +66,11 @@ class Notification extends BaseModule if ($request_id) { try { - $notification = DI::notify()->getByID($request_id); - $notification->setSeen(); + $notify = DI::notify()->getByID($request_id); + DI::notify()->setSeen(true, $notify); - if (!empty($notification->link)) { - System::externalRedirect($notification->link); + if (!empty($notify->link)) { + System::externalRedirect($notify->link); } } catch (HTTPException\NotFoundException $e) { @@ -83,4 +83,3 @@ class Notification extends BaseModule DI::baseUrl()->redirect('notifications/system'); } } - diff --git a/src/Repository/Notify.php b/src/Repository/Notify.php index 8c71fc289..b53bd8441 100644 --- a/src/Repository/Notify.php +++ b/src/Repository/Notify.php @@ -7,6 +7,7 @@ use Friendica\BaseRepository; use Friendica\Core\Hook; use Friendica\Model; use Friendica\Collection; +use Friendica\Network\HTTPException\InternalServerErrorException; use Friendica\Network\HTTPException\NotFoundException; use Friendica\Util\DateTimeFormat; @@ -52,14 +53,28 @@ class Notify extends BaseRepository } /** - * {@inheritDoc} + * Set seen state of notifications of the local_user() + * + * @param bool $seen optional true or false. default true + * @param Model\Notify $notify optional a notify, which should be set seen (including his parents) * * @return bool true on success, false on error + * * @throws Exception */ - public function setAllSeen(bool $seen = true) + public function setSeen(bool $seen = true, Model\Notify $notify = null) { - return $this->dba->update('notify', ['seen' => $seen], ['uid' => local_user()]); + if (empty($notify)) { + $conditions = ['uid' => local_user()]; + } else { + $conditions = ['(`link` = ? OR (`parent` != 0 AND `parent` = ? AND `otype` = ?)) AND `uid` = ?', + $notify->link, + $notify->parent, + $notify->otype, + local_user()]; + } + + return $this->dba->update('notify', ['seen' => $seen], $conditions); } /** @@ -67,12 +82,12 @@ class Notify extends BaseRepository * * @return Model\Notify|false * - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws InternalServerErrorException * @throws Exception */ public function insert(array $fields) { - $fields['date'] = DateTimeFormat::utcNow(); + $fields['date'] = DateTimeFormat::utcNow(); Hook::callAll('enotify_store', $fields); diff --git a/tests/include/ApiTest.php b/tests/include/ApiTest.php index 3ef64b317..e8e148d43 100644 --- a/tests/include/ApiTest.php +++ b/tests/include/ApiTest.php @@ -19,6 +19,7 @@ use Friendica\DI; use Friendica\Model\Contact; use Friendica\Network\HTTPException; use Friendica\Test\Util\Database\StaticDatabase; +use Friendica\Util\Temporal; use Monolog\Handler\TestHandler; require_once __DIR__ . '/../../include/api.php'; @@ -3940,10 +3941,11 @@ class ApiTest extends DatabaseTest $this->app->argv = ['api', 'friendica', 'notification']; $this->app->argc = count($this->app->argv); $result = api_friendica_notification('xml'); + $dateRel = Temporal::getRelativeDate('2020-01-01 12:12:02'); $assertXml=<< - + XML; $this->assertXmlStringEqualsXmlString($assertXml, $result);