/**
* @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;
}