/** * Validates permissions for given object. */ protected function validateObjectParameters() { if (!MODULE_LIKE) { throw new PermissionDeniedException(); } $this->readString('containerID', false, 'data'); $this->readInteger('objectID', false, 'data'); $this->readString('objectType', false, 'data'); $this->objectType = LikeHandler::getInstance()->getObjectType($this->parameters['data']['objectType']); if ($this->objectType === null) { throw new UserInputException('objectType'); } $this->objectTypeProvider = $this->objectType->getProcessor(); $this->likeableObject = $this->objectTypeProvider->getObjectByID($this->parameters['data']['objectID']); $this->likeableObject->setObjectType($this->objectType); if (!$this->objectTypeProvider->checkPermissions($this->likeableObject)) { throw new PermissionDeniedException(); } }
/** * @see \wcf\data\like\ILikeObjectTypeProvider::checkPermissions() */ public function checkPermissions(ILikeObject $news) { // make sure, the news is accessible return $news->canRead(); }
/** * @see \wcf\data\like\ILikeObjectTypeProvider::checkPermissions() */ public function checkPermissions(ILikeObject $object) { return $object->entryID && $object->canRead(); }
/** * 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); }