public function handle($command) { $user = $command->user; // 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, $user); $discussion->assertCan($user, 'reply'); // Create a new Post entity, persist it, and dispatch domain events. // Before persistance, though, fire an event to give plugins an // opportunity to alter the post entity based on data in the command. $post = CommentPost::reply($command->discussionId, array_get($command->data, 'content'), $user->id); event(new PostWillBeSaved($post, $command)); $post->save(); $this->notifications->onePerUser(function () use($post) { $this->dispatchEventsFor($post); }); return $post; }
/** * Run the database seeds. * * @return void */ public function run() { Discussion::unguard(); Post::unguard(); $faker = \Faker\Factory::create(); $users = User::count(); for ($i = 0; $i < 100; $i++) { $posts_count = $i == 1 ? 400 : rand(1, rand(1, rand(1, 100))); $discussion = Discussion::create(['title' => str_replace("'", '', rtrim($faker->realText(rand(20, 80)), '.')), 'start_time' => $faker->dateTimeThisYear, 'start_user_id' => rand(1, $users)]); $discussion->comments_count = $posts_count; $post = CommentPost::create(['discussion_id' => $discussion->id, 'number' => 1, 'time' => $discussion->start_time, 'user_id' => $discussion->start_user_id, 'content' => $faker->realText(rand(100, 1000))]); $discussion->start_post_id = $post->id; $discussion->last_time = $post->time; $discussion->last_user_id = $post->user_id; $discussion->last_post_id = $post->id; $discussion->last_post_number = $post->number; $discussion->number_index = $post->number; $lastPost = null; $count = $posts_count; $posts = []; $startTime = $discussion->start_time; $numberOffset = 0; for ($j = 0; $j < $count - 1; $j++) { if (rand(1, 100) == 1) { $discussion->comments_count--; $post = DiscussionRenamedPost::create(['discussion_id' => $discussion->id, 'time' => $startTime = date_add($startTime, date_interval_create_from_date_string('1 second')), 'user_id' => rand(1, $users), 'content' => json_encode(array($faker->realText(rand(20, 40)), $discussion->title))]); } else { $edited = rand(1, 20) == 1; $hidden = rand(1, 100) == 1; if ($hidden) { $discussion->comments_count--; } $post = CommentPost::create(['discussion_id' => $discussion->id, 'number' => $j + 2 + $numberOffset, 'time' => $startTime = date_add($startTime, date_interval_create_from_date_string('1 second')), 'user_id' => rand(1, $users), 'content' => $faker->realText(rand(50, 500)), 'edit_time' => $edited ? $startTime = date_add($startTime, date_interval_create_from_date_string('1 second')) : null, 'edit_user_id' => $edited ? rand(1, $users) : null, 'hide_time' => $hidden ? $startTime = date_add($startTime, date_interval_create_from_date_string('1 second')) : null, 'hide_user_id' => $hidden ? rand(1, $users) : null]); $posts[] = $post; if (!$lastPost or $post->time >= $lastPost->time) { $lastPost = $post; } } if (rand(1, 20) == 1) { $numberOffset += rand(0, 3); } } // Update the discussion's last post details. if ($lastPost) { $discussion->last_time = $lastPost->time; $discussion->last_user_id = $lastPost->user_id; $discussion->last_post_id = $lastPost->id; $discussion->last_post_number = $lastPost->number; } $discussion->number_index = $j + 1 + $numberOffset; $discussion->save(); // Give some users some random discussion state data. for ($j = rand(0, 100); $j < 100; $j++) { try { DiscussionState::create(['discussion_id' => $discussion->id, 'user_id' => rand(1, $users), 'read_number' => rand(0, $posts_count - 1), 'read_time' => $faker->dateTimeBetween($discussion->start_time, 'now')]); } catch (\Illuminate\Database\QueryException $e) { } } } // Update user post and discussion counts. $prefix = DB::getTablePrefix(); DB::table('users')->update(['discussions_count' => DB::raw('(SELECT COUNT(id) FROM ' . $prefix . 'discussions WHERE start_user_id = ' . $prefix . 'users.id)'), 'comments_count' => DB::raw('(SELECT COUNT(id) FROM ' . $prefix . 'posts WHERE user_id = ' . $prefix . 'users.id and type = \'comment\')')]); }
public function registerPostTypes() { Post::addType('Flarum\\Core\\Models\\CommentPost'); Post::addType('Flarum\\Core\\Models\\DiscussionRenamedPost'); CommentPost::setFormatter($this->app['flarum.formatter']); }