display seeder progress

This commit is contained in:
IsWaffle 2024-09-11 14:41:31 -04:00
parent 2932e48c7f
commit 1874dab621

View File

@ -11,6 +11,8 @@ use App\Models\User;
use App\Models\UserRole; use App\Models\UserRole;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
use function Laravel\Prompts\progress;
class DatabaseSeeder extends Seeder class DatabaseSeeder extends Seeder
{ {
/** /**
@ -18,46 +20,98 @@ class DatabaseSeeder extends Seeder
*/ */
public function run(): void public function run(): void
{ {
// how many of each "thing" to make during seeding
$userCount = 100;
$modCount = 300;
$modVersionCount = 3000;
// Create a few SPT versions. // Create a few SPT versions.
$spt_versions = SptVersion::factory(30)->create(); $spt_versions = SptVersion::factory(30)->create();
// Create some code licenses. // Create some code licenses.
$licenses = License::factory(10)->create(); $licenses = License::factory(10)->create();
// Add 5 administrators. // Add administrators.
$administrator = UserRole::factory()->administrator()->create(); $administratorRole = UserRole::factory()->administrator()->create();
User::factory()->for($administrator, 'role')->create([ $testAccount = User::factory()->for($administratorRole, 'role')->create([
'email' => 'test@example.com', 'email' => 'test@example.com',
]); ]);
User::factory(4)->for($administrator, 'role')->create();
// Add 10 moderators. $this->command->outputComponents()->info("test account created: $testAccount->email");
$moderator = UserRole::factory()->moderator()->create();
User::factory(5)->for($moderator, 'role')->create();
// Add 100 users. User::factory(4)->for($administratorRole, 'role')->create();
$users = User::factory(100)->create();
// Add 300 mods, assigning them to the users we just created. // Add moderators.
$allUsers = $users->merge([$administrator, $moderator]); $moderatorRole = UserRole::factory()->moderator()->create();
$mods = Mod::factory(300)->recycle([$licenses])->create(); User::factory(5)->for($moderatorRole, 'role')->create();
foreach ($mods as $mod) {
$userIds = $allUsers->random(rand(1, 3))->pluck('id')->toArray();
$mod->users()->attach($userIds);
}
// Add 3000 mod versions, assigning them to the mods we just created. // Add users
$modVersions = ModVersion::factory(3000)->recycle([$mods, $spt_versions])->create(); 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. // Add ModDependencies to a subset of ModVersions.
foreach ($modVersions as $modVersion) { progress(
$hasDependencies = rand(0, 100) < 30; // 30% chance to have dependencies label: 'adding mods dependencies ...',
if ($hasDependencies) { steps: $modVersions,
$dependencyMods = $mods->random(rand(1, 3)); // 1 to 3 dependencies callback: function ($modVersion) use ($mods) {
foreach ($dependencyMods as $dependencyMod) { $hasDependencies = rand(0, 100) < 30; // 30% chance to have dependencies
ModDependency::factory()->recycle([$modVersion, $dependencyMod])->create(); 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');
} }
} }