public function store() { $discussion = BeatmapDiscussion::findOrNew(Request::input('beatmap_discussion_id')); $isNewDiscussion = $discussion->id === null; if ($isNewDiscussion) { $beatmapsetDiscussion = BeatmapsetDiscussion::where('beatmapset_id', Request::input('beatmapset_id'))->firstOrFail(); $discussion->beatmapset_discussion_id = $beatmapsetDiscussion->id; } $posts = [new BeatmapDiscussionPost($this->postParams($discussion))]; $previousDiscussionResolved = $discussion->resolved; $discussion->fill($this->discussionParams($isNewDiscussion)); priv_check('BeatmapDiscussionPost', $discussion)->ensureCan(); if ($discussion->resolved === true) { priv_check('BeatmapDiscussionResolve', $discussion)->ensureCan(); } if (!$isNewDiscussion && $discussion->resolved !== $previousDiscussionResolved) { $posts[] = BeatmapDiscussionPost::generateLogResolveChange(Auth::user(), $discussion->resolved); } try { $saved = DB::transaction(function () use($posts, $discussion) { if ($discussion->save() === false) { throw new Exception('failed'); } foreach ($posts as $post) { // done here since discussion may or may not previously exist $post->beatmap_discussion_id = $discussion->id; if ($post->save() === false) { throw new Exception('failed'); } } return true; }); } catch (Exception $_e) { $saved = false; } $postIds = array_pluck($posts, 'id'); if ($saved === true) { return ['beatmapset_discussion' => $posts[0]->beatmapsetDiscussion->defaultJson(Auth::user()), 'beatmap_discussion_post_ids' => $postIds, 'beatmap_discussion_id' => $discussion->id]; } else { return error_popup(trans('beatmaps.discussion-posts.store.error')); } }