]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/Favorite/classes/Fave.php
Merge remote-tracking branch 'upstream/master' into social-master
[quix0rs-gnu-social.git] / plugins / Favorite / classes / Fave.php
index ab78478db5e43f237a2e4c7ec1964acd42970b2e..bad8d42b8c5e747d4434b762b77208574a7349ab 100644 (file)
@@ -114,24 +114,41 @@ class Fave extends Managed_DataObject
 
     public function delete($useWhere=false)
     {
-        $profile = Profile::getKV('id', $this->user_id);
-        $notice  = Notice::getKV('id', $this->notice_id);
-
         $result = null;
 
-        if (Event::handle('StartDisfavorNotice', array($profile, $notice, &$result))) {
+        try {
+            $profile = $this->getActor();
+            $notice  = $this->getTarget();
 
-            $result = parent::delete($useWhere);
+            if (Event::handle('StartDisfavorNotice', array($profile, $notice, &$result))) {
 
-            self::blowCacheForProfileId($this->user_id);
-            self::blowCacheForNoticeId($this->notice_id);
-            self::blow('popular');
+                $result = parent::delete($useWhere);
 
-            if ($result) {
-                Event::handle('EndDisfavorNotice', array($profile, $notice));
+                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);
+        }
+
+        // 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;
     }
 
@@ -250,7 +267,7 @@ class Fave extends Managed_DataObject
      *
      * @return array Array of Fave objects
      */
-    static public function byNotice($notice)
+    static public function byNotice(Notice $notice)
     {
         if (!isset(self::$_faves[$notice->id])) {
             self::fillFaves(array($notice->id));
@@ -357,7 +374,7 @@ class Fave extends Managed_DataObject
         $target = self::getTargetFromStored($stored);
 
         // The following logic was copied from StatusNet's Activity plugin
-        if (ActivityUtils::compareTypes($target->verb, array(ActivityVerb::POST))) {
+        if (ActivityUtils::compareVerbs($target->verb, array(ActivityVerb::POST))) {
             // "I like the thing you posted"
             $act->objects = $target->asActivity()->objects;
         } else {
@@ -391,14 +408,7 @@ class Fave extends Managed_DataObject
 
     public function getTarget()
     {
-        // throws exception on failure
-        $target = new Notice();
-        $target->id = $this->notice_id;
-        if (!$target->find(true)) {
-            throw new NoResultException($target);
-        }
-
-        return $target;
+        return Notice::getByID($this->notice_id);
     }
 
     public function getTargetObject()
@@ -423,12 +433,7 @@ class Fave extends Managed_DataObject
 
     public function getActor()
     {
-        $profile = new Profile();
-        $profile->id = $this->user_id;
-        if (!$profile->find(true)) {
-            throw new NoResultException($profile);
-        }
-        return $profile;
+        return Profile::getByID($this->user_id);
     }
 
     public function getActorObject()
@@ -445,16 +450,4 @@ class Fave extends Managed_DataObject
         // We (should've in this case) created it ourselves, so we tag it ourselves
         return self::newUri($this->getActor(), $this->getTarget(), $this->created);
     }
-
-    static function newUri(Profile $actor, Managed_DataObject $target, $created=null)
-    {
-        if (is_null($created)) {
-            $created = common_sql_now();
-        }
-        return TagURI::mint(strtolower(get_called_class()).':%d:%s:%d:%s',
-                                        $actor->id,
-                                        ActivityUtils::resolveUri(self::getObjectType(), true),
-                                        $target->id,
-                                        common_date_iso8601($created));
-    }
 }