Find a discussion by ID, optionally making sure it is visible to a
certain user, or throw an exception.
public findOrFail ( integer $id, |
||
$id | integer | |
$user | ||
return |
/** * @param PostReply $command * @return CommentPost * @throws \Flarum\Core\Exception\PermissionDeniedException */ public function handle(PostReply $command) { $actor = $command->actor; // Make sure the user has permission to reply to this discussion. First, // make sure the discussion exists and that the user has permission to // view it; if not, fail with a ModelNotFound exception so we don't give // away the existence of the discussion. If the user is allowed to view // it, check if they have permission to reply. $discussion = $this->discussions->findOrFail($command->discussionId, $actor); $this->assertCan($actor, 'reply', $discussion); // Create a new Post entity, persist it, and dispatch domain events. // Before persistence, though, fire an event to give plugins an // opportunity to alter the post entity based on data in the command. $post = CommentPost::reply($discussion->id, array_get($command->data, 'attributes.content'), $actor->id, $command->ipAddress); if ($actor->isAdmin() && ($time = array_get($command->data, 'attributes.time'))) { $post->time = new DateTime($time); } $this->events->fire(new PostWillBeSaved($post, $actor, $command->data)); $this->validator->assertValid($post->getAttributes()); $post->save(); $this->notifications->onePerUser(function () use($post, $actor) { $this->dispatchEventsFor($post, $actor); }); return $post; }
/** * @param DeleteDiscussion $command * @return \Flarum\Core\Discussion * @throws PermissionDeniedException */ public function handle(DeleteDiscussion $command) { $actor = $command->actor; $discussion = $this->discussions->findOrFail($command->discussionId, $actor); $this->assertCan($actor, 'delete', $discussion); $this->events->fire(new DiscussionWillBeDeleted($discussion, $actor, $command->data)); $discussion->delete(); $this->dispatchEventsFor($discussion, $actor); return $discussion; }
/** * {@inheritdoc} */ protected function data(ServerRequestInterface $request, Document $document) { $discussionId = array_get($request->getQueryParams(), 'id'); $actor = $request->getAttribute('actor'); $include = $this->extractInclude($request); $discussion = $this->discussions->findOrFail($discussionId, $actor); if (in_array('posts', $include)) { $postRelationships = $this->getPostRelationships($include); $this->includePosts($discussion, $request, $postRelationships); } return $discussion; }
/** * @param ReadDiscussion $command * @return \Flarum\Core\DiscussionState * @throws \Flarum\Core\Exception\PermissionDeniedException */ public function handle(ReadDiscussion $command) { $actor = $command->actor; $this->assertRegistered($actor); $discussion = $this->discussions->findOrFail($command->discussionId, $actor); $state = $discussion->stateFor($actor); $state->read($command->readNumber); $this->events->fire(new DiscussionStateWillBeSaved($state)); $state->save(); $this->dispatchEventsFor($state); return $state; }
/** * @param EditDiscussion $command * @return \Flarum\Core\Discussion * @throws PermissionDeniedException */ public function handle(EditDiscussion $command) { $actor = $command->actor; $data = $command->data; $attributes = array_get($data, 'attributes', []); $discussion = $this->discussions->findOrFail($command->discussionId, $actor); if (isset($attributes['title'])) { $this->assertCan($actor, 'rename', $discussion); $discussion->rename($attributes['title']); } if (isset($attributes['isHidden'])) { $this->assertCan($actor, 'hide', $discussion); if ($attributes['isHidden']) { $discussion->hide($actor); } else { $discussion->restore(); } } $this->events->fire(new DiscussionWillBeSaved($discussion, $actor, $data)); $this->validator->assertValid($discussion->getDirty()); $discussion->save(); $this->dispatchEventsFor($discussion, $actor); return $discussion; }