From 1874dab621732513c0235509ef101fb33ef3e2df Mon Sep 17 00:00:00 2001 From: "waffle.lord" Date: Wed, 11 Sep 2024 14:41:31 -0400 Subject: [PATCH] display seeder progress --- database/seeders/DatabaseSeeder.php | 104 +++++++++++++++++++++------- 1 file changed, 79 insertions(+), 25 deletions(-) diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 1cfedfb..6becca0 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -11,6 +11,8 @@ use App\Models\User; use App\Models\UserRole; use Illuminate\Database\Seeder; +use function Laravel\Prompts\progress; + class DatabaseSeeder extends Seeder { /** @@ -18,46 +20,98 @@ class DatabaseSeeder extends Seeder */ public function run(): void { + // how many of each "thing" to make during seeding + $userCount = 100; + $modCount = 300; + $modVersionCount = 3000; + // Create a few SPT versions. $spt_versions = SptVersion::factory(30)->create(); // Create some code licenses. $licenses = License::factory(10)->create(); - // Add 5 administrators. - $administrator = UserRole::factory()->administrator()->create(); - User::factory()->for($administrator, 'role')->create([ + // Add administrators. + $administratorRole = UserRole::factory()->administrator()->create(); + $testAccount = User::factory()->for($administratorRole, 'role')->create([ 'email' => 'test@example.com', ]); - User::factory(4)->for($administrator, 'role')->create(); - // Add 10 moderators. - $moderator = UserRole::factory()->moderator()->create(); - User::factory(5)->for($moderator, 'role')->create(); + $this->command->outputComponents()->info("test account created: $testAccount->email"); - // Add 100 users. - $users = User::factory(100)->create(); + User::factory(4)->for($administratorRole, 'role')->create(); - // Add 300 mods, assigning them to the users we just created. - $allUsers = $users->merge([$administrator, $moderator]); - $mods = Mod::factory(300)->recycle([$licenses])->create(); - foreach ($mods as $mod) { - $userIds = $allUsers->random(rand(1, 3))->pluck('id')->toArray(); - $mod->users()->attach($userIds); - } + // Add moderators. + $moderatorRole = UserRole::factory()->moderator()->create(); + User::factory(5)->for($moderatorRole, 'role')->create(); - // Add 3000 mod versions, assigning them to the mods we just created. - $modVersions = ModVersion::factory(3000)->recycle([$mods, $spt_versions])->create(); + // Add users + progress( + label: 'adding users...', + steps: $userCount, + callback: fn () => User::factory()->create() + ); + + // get all users + $allUsers = User::all(); + + // Add user follows + progress( + label: 'adding user follows ...', + steps: $allUsers, + callback: function ($user) use ($allUsers) { + $hasFollowers = rand(0, 100) < 70; // 70% chance to have followers + $isFollowing = rand(0, 100) < 70; // 70% chance to be following other users + + if ($hasFollowers) { + $followers = $allUsers->random(rand(1, 10))->pluck('id')->toArray(); + $user->followers()->attach($followers); + } + + if ($isFollowing) { + $following = $allUsers->random(rand(1, 10))->pluck('id')->toArray(); + $user->following()->attach($following); + } + }); + + $mods = collect(progress( + label: 'adding mods...', + steps: $modCount, + callback: fn () => Mod::factory()->recycle([$licenses])->create() + )); + + // attach users to mods + progress( + label: 'attaching mod users ...', + steps: $mods, + callback: function ($mod) use ($allUsers) { + $userIds = $allUsers->random(rand(1, 3))->pluck('id')->toArray(); + $mod->users()->attach($userIds); + } + ); + + // Add mod versions, assigning them to the mods we just created. + $modVersions = collect(progress( + label: 'adding mods versions ...', + steps: $modVersionCount, + callback: fn () => ModVersion::factory()->recycle([$mods, $spt_versions])->create() + )); // Add ModDependencies to a subset of ModVersions. - foreach ($modVersions as $modVersion) { - $hasDependencies = rand(0, 100) < 30; // 30% chance to have dependencies - if ($hasDependencies) { - $dependencyMods = $mods->random(rand(1, 3)); // 1 to 3 dependencies - foreach ($dependencyMods as $dependencyMod) { - ModDependency::factory()->recycle([$modVersion, $dependencyMod])->create(); + progress( + label: 'adding mods dependencies ...', + steps: $modVersions, + callback: function ($modVersion) use ($mods) { + $hasDependencies = rand(0, 100) < 30; // 30% chance to have dependencies + if ($hasDependencies) { + $dependencyMods = $mods->random(rand(1, 3)); // 1 to 3 dependencies + foreach ($dependencyMods as $dependencyMod) { + ModDependency::factory()->recycle([$modVersion, $dependencyMod])->create(); + } } } - } + ); + + $this->command->outputComponents()->success('Database seeded'); } }