/** * Validates parameters for like-related actions. */ public function validateLike() { $this->validateObjectParameters(); // check permissions if (!WCF::getUser()->userID || !WCF::getSession()->getPermission('user.like.canLike')) { throw new PermissionDeniedException(); } // check if liking own content but forbidden by configuration $this->likeableObject = $this->objectTypeProvider->getObjectByID($this->parameters['data']['objectID']); $this->likeableObject->setObjectType($this->objectType); if (!LIKE_ALLOW_FOR_OWN_CONTENT && $this->likeableObject->getUserID() == WCF::getUser()->userID) { throw new PermissionDeniedException(); } }
/** * Reverts the like of an object. * * @param \wcf\data\like\Like $like * @param \wcf\data\like\object\ILikeObject $likeable * @param \wcf\data\like\object\LikeObject $likeObject * @param \wcf\data\user\User $user * @return array */ public function revertLike(Like $like, ILikeObject $likeable, LikeObject $likeObject, User $user) { try { WCF::getDB()->beginTransaction(); // delete like $editor = new LikeEditor($like); $editor->delete(); // update like object cache $likes = $likeObject->likes; $dislikes = $likeObject->dislikes; $cumulativeLikes = $likeObject->cumulativeLikes; if ($like->likeValue == Like::LIKE) { $likes--; $cumulativeLikes--; } else { $dislikes--; $cumulativeLikes++; } // build update data $updateData = array('likes' => $likes, 'dislikes' => $dislikes, 'cumulativeLikes' => $cumulativeLikes); $users = $likeObject->getUsers(); $usersArray = array(); foreach ($users as $user2) { $usersArray[$user2->userID] = array('userID' => $user2->userID, 'username' => $user2->username); } if (isset($usersArray[$user->userID])) { unset($usersArray[$user->userID]); $updateData['cachedUsers'] = serialize($usersArray); } $likeObjectEditor = new LikeObjectEditor($likeObject); if (!$updateData['likes'] && !$updateData['dislikes']) { // remove object instead $likeObjectEditor->delete(); } else { // update data $likeObjectEditor->update($updateData); } // update owner's like counter and activity points if ($likeable->getUserID()) { if ($like->likeValue == Like::LIKE) { $userEditor = new UserEditor(new User($likeable->getUserID())); $userEditor->updateCounters(array('likesReceived' => -1)); UserActivityPointHandler::getInstance()->removeEvents('com.woltlab.wcf.like.activityPointEvent.receivedLikes', array($likeable->getUserID() => 1)); } } // update object's like counter $likeable->updateLikeCounter($cumulativeLikes); WCF::getDB()->commitTransaction(); } catch (DatabaseException $e) { WCF::getDB()->rollBackTransaction(); } return array('data' => $this->loadLikeStatus($likeObject, $user), 'newValue' => null, 'oldValue' => $like->likeValue, 'users' => $usersArray); }