]> git.mxchange.org Git - friendica.git/commitdiff
Notifications cleared for a whole thread in case of one mark seen
authornupplaPhil <admin@philipp.info>
Fri, 31 Jan 2020 20:34:12 +0000 (21:34 +0100)
committernupplaPhil <admin@philipp.info>
Fri, 31 Jan 2020 20:34:12 +0000 (21:34 +0100)
include/api.php
src/Model/Notify.php
src/Module/Notifications/Notification.php
src/Repository/Notify.php

index 3f4d5625b0f8b44f1d4931e141de6cdf33982edf..b21061646ab2ac351302902a57ba536819769a3c 100644 (file)
@@ -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);
@@ -5973,6 +5973,8 @@ function api_friendica_notification_seen($type)
                return api_format_data('result', $type, ['result' => "success"]);
        } catch (NotFoundException $e) {
                throw new BadRequestException('Invalid argument');
+       } catch (Exception $e) {
+               throw new InternalServerErrorException('Internal Server exception');
        }
 }
 
index b12eb341b0d188d4adbcdf4f8308e6301925584f..35d72384e89526cb94e362dbd1bbab159db67478 100644 (file)
@@ -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)
         */
index 6df58374eccc2973d8ca3fc9b4060cd6a6c5c1c9..34ab3d5acea5d345cd89cf21fe2ccc4f92dc2f91 100644 (file)
@@ -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');
        }
 }
-
index 8c71fc289a1bd830b08515db4b16e1ef0e57896f..b53bd844113f6e0001d1655917610b68527032f2 100644 (file)
@@ -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);