Use EmptyIdException in Fave deletion try-catch
authorMikael Nordfeldth <mmn@hethane.se>
Sun, 3 Jan 2016 21:57:28 +0000 (22:57 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Sun, 3 Jan 2016 21:57:28 +0000 (22:57 +0100)
plugins/Favorite/classes/Fave.php

index 7fa7705e8faee2a854c2f782ce883723c289b6a4..66d5a186d8e2056f8a631c2609a174a71b7fc18b 100644 (file)
@@ -124,27 +124,30 @@ class Fave extends Managed_DataObject
 
                 $result = parent::delete($useWhere);
 
-                self::blowCacheForProfileId($this->user_id);
-                self::blowCacheForNoticeId($this->notice_id);
-                self::blow('popular');
-
                 if ($result !== false) {
                     Event::handle('EndDisfavorNotice', array($profile, $notice));
                 }
             }
 
         } catch (NoResultException $e) {
+            // In case there's some inconsistency where the profile or notice was deleted without losing the fave db entry
             common_log(LOG_INFO, '"'.get_class($e->obj).'" with id=='.var_export($e->obj->id, true).' object not found when deleting favorite, ignoring...');
+        } catch (EmptyIdException $e) {
+            // Some buggy instances of GNU social have had favroites with notice id==0 stored in the database
+            common_log(LOG_INFO, '"'.get_class($e->obj).'"object had empty id deleting favorite, ignoring...');
+        }
 
+        // If we catch an exception above, then $result===null because parent::delete only returns an int>=0 or boolean false
+        if (is_null($result)) {
             // Delete it without the event, as something is wrong and we don't want it anyway.
             $result = parent::delete($useWhere);
-
-            self::blowCacheForProfileId($this->user_id);
-            self::blowCacheForNoticeId($this->notice_id);
-            self::blow('popular');
         }
 
-
+        // Err, apparently we can reference $this->user_id after parent::delete,
+        // I guess it's safe because this is the order it was before!
+        self::blowCacheForProfileId($this->user_id);
+        self::blowCacheForNoticeId($this->notice_id);
+        self::blow('popular');
 
         return $result;
     }