X-Git-Url: https://git.mxchange.org/?p=quix0rs-gnu-social.git;a=blobdiff_plain;f=plugins%2FFavorite%2Fclasses%2FFave.php;h=bad8d42b8c5e747d4434b762b77208574a7349ab;hp=68c36dfaef5b6710ccbf2771f3aa612a498aba5c;hb=d6b28c64830f632bb2f4b6f3c9369b9e56ad217a;hpb=9827e6ad849a61d4505f3991f34f0758b2892697 diff --git a/plugins/Favorite/classes/Fave.php b/plugins/Favorite/classes/Fave.php index 68c36dfaef..bad8d42b8c 100644 --- a/plugins/Favorite/classes/Fave.php +++ b/plugins/Favorite/classes/Fave.php @@ -8,7 +8,7 @@ class Fave extends Managed_DataObject public $__table = 'fave'; // table name public $notice_id; // int(4) primary_key not_null public $user_id; // int(4) primary_key not_null - public $uri; // varchar(255) + public $uri; // varchar(191) not 255 because utf8mb4 takes more space not 255 because utf8mb4 takes more space public $created; // datetime multiple_key not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -18,7 +18,7 @@ class Fave extends Managed_DataObject 'fields' => array( 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice that is the favorite'), 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who likes this notice'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universally unique identifier, usually a tag URI'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), @@ -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); @@ -224,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)); @@ -331,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 { @@ -365,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() @@ -397,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() @@ -419,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)); - } }