X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FFavorite%2Fclasses%2FFave.php;h=a5acb66d20d80ef5bbf91c11a57ed7df3e187f39;hb=3471213d1c9921a6433678edc2f4ca0113a73287;hp=094b65feaa94fd19b38f6b5dd12e6af5b48ebd10;hpb=2f86cd860231f92213950d439e9a109b7a5f11c4;p=quix0rs-gnu-social.git diff --git a/plugins/Favorite/classes/Fave.php b/plugins/Favorite/classes/Fave.php index 094b65feaa..a5acb66d20 100644 --- a/plugins/Favorite/classes/Fave.php +++ b/plugins/Favorite/classes/Fave.php @@ -48,6 +48,11 @@ class Fave extends Managed_DataObject * @throws Exception on failure */ static function addNew(Profile $actor, Notice $target) { + if (self::existsForProfile($target, $actor)) { + // TRANS: Client error displayed when trying to mark a notice as favorite that already is a favorite. + throw new AlreadyFulfilledException(_('You have already favorited this!')); + } + $act = new Activity(); $act->type = ActivityObject::ACTIVITY; $act->verb = ActivityVerb::FAVORITE; @@ -74,6 +79,27 @@ class Fave extends Managed_DataObject return $stored; } + public function removeEntry(Profile $actor, Notice $target) + { + $fave = new Fave(); + $fave->user_id = $actor->getID(); + $fave->notice_id = $target->getID(); + if (!$fave->find(true)) { + // TRANS: Client error displayed when trying to remove a 'favor' when there is none in the first place. + throw new AlreadyFulfilledException(_('This is already not favorited.')); + } + + $result = $fave->delete(); + if ($result === false) { + common_log_db_error($fave, 'DELETE', __FILE__); + // TRANS: Server error displayed when removing a favorite from the database fails. + throw new ServerException(_('Could not delete favorite.')); + } + + Fave::blowCacheForProfileId($actor->getID()); + Fave::blowCacheForNoticeId($target->getID()); + } + // exception throwing takeover! public function insert() { @@ -88,28 +114,45 @@ 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; } - function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $own=false, $since_id=0, $max_id=0) + static function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $own=false, $since_id=0, $max_id=0) { $stream = new FaveNoticeStream($user_id, $own); @@ -310,6 +353,8 @@ class Fave extends Managed_DataObject */ static public function parseActivityObject(ActivityObject $actobj, Notice $stored) { + // throws exception if nothing was found, but it could also be a non-Notice... + // FIXME: This should only test _one_ URI (and not the links etc.) though a function like this could be useful in other cases $local = ActivityUtils::findLocalObject($actobj->getIdentifiers()); if (!$local instanceof Notice) { // $local always returns something, but this was not what we expected. Something is wrong. @@ -331,7 +376,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 { @@ -365,14 +410,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() @@ -397,12 +435,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() @@ -419,16 +452,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)); - } }