connection->transaction(function() use($request) { $this->thread = $this->storeThreadTask->run($this->prepareThreadData($request)); if(is_null($this->thread)) { throw new Exception('The thread could not be created'); } $post = $this->storePostTask->run($this->preparePostData($this->thread, $request)); $this->updateThreadTask->run($this->thread, [ 'slug' => $this->thread->slug . '-' . $this->thread->id, 'lastpost_uuid' => $post->uuid, 'firstpost_uuid' => $post->uuid ]); $this->updateForumTask->run($request->forum, $this->prepareForumData($request->forum, $post)); }); } catch (Throwable $t) { return false; } return $this->thread; } /** * @param Store $request * @return array */ private function prepareThreadData(Store $request): array { return [ 'created_uuid' => $request->user()->uuid, 'updated_uuid' => $request->user()->uuid, 'forum_uuid' => $request->post('forum_uuid'), 'prefix_uuid' => $request->post('prefix'), 'title' => $request->post('title'), 'slug' => Str::slug($request->post('title')), 'users' => $this->preparePivotData($request, 'users'), 'groups' => $this->preparePivotData($request, 'groups'), ]; } /** * @param Thread $thread * @param Store $request * @return array */ private function preparePostData(Thread $thread, Store $request): array { return [ 'created_uuid' => $request->user()->uuid, 'updated_uuid' => $request->user()->uuid, 'thread_uuid' => $thread->uuid, 'title' => $request->post('title'), 'content' => $request->post('content'), 'users' => $this->preparePivotData($request, 'users'), 'groups' => $this->preparePivotData($request, 'groups'), ]; } /** * @param Forum $forum * @param Post $post * @return array */ private function prepareForumData(Forum $forum, Post $post): array { return [ 'thread_count' => $forum->thread_count + 1, 'posting_count' => $forum->posting_count + 1, 'lastpost_uuid' => $post->uuid ]; } }