Seeder Updaes

- Commented out the follower seeding function as it's not yet merged.
- SPT Versions are now being generated through the ModVersionFactory.
- After initial data has been generated, jobs are called to get the site to a 'ready' state.
- Clears cache
This commit is contained in:
Refringe 2024-09-11 23:07:45 -04:00
parent 0dc21378ab
commit bd2d38b4e4
Signed by: Refringe
SSH Key Fingerprint: SHA256:t865XsQpfTeqPRBMN2G6+N8wlDjkgUCZF3WGW6O9N/k

View File

@ -6,10 +6,11 @@ use App\Models\License;
use App\Models\Mod; use App\Models\Mod;
use App\Models\ModDependency; use App\Models\ModDependency;
use App\Models\ModVersion; use App\Models\ModVersion;
use App\Models\SptVersion;
use App\Models\User; use App\Models\User;
use App\Models\UserRole; use App\Models\UserRole;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Artisan;
use Laravel\Prompts\Progress;
use function Laravel\Prompts\progress; use function Laravel\Prompts\progress;
@ -20,42 +21,44 @@ class DatabaseSeeder extends Seeder
*/ */
public function run(): void public function run(): void
{ {
// how many of each "thing" to make during seeding // How many of each entity to create.
$userCount = 100; $counts = [
$modCount = 300; 'license' => 10,
$modVersionCount = 3000; 'administrator' => 5,
'moderator' => 5,
'user' => 100,
'mod' => 200,
'modVersion' => 1500,
];
// Create a few SPT versions. // Licenses
$spt_versions = SptVersion::factory(30)->create(); $licenses = License::factory($counts['license'])->create();
// Create some code licenses. // Administrator Users
$licenses = License::factory(10)->create();
// Add administrators.
$administratorRole = UserRole::factory()->administrator()->create(); $administratorRole = UserRole::factory()->administrator()->create();
$testAccount = User::factory()->for($administratorRole, 'role')->create([ $testAccount = User::factory()->for($administratorRole, 'role')->create([
'email' => 'test@example.com', 'email' => 'test@example.com',
]); ]);
User::factory($counts['administrator'] - 1)->for($administratorRole, 'role')->create();
$this->command->outputComponents()->info("test account created: $testAccount->email"); $this->command->outputComponents()->info("Test account created: {$testAccount->email}");
User::factory(4)->for($administratorRole, 'role')->create(); // Moderator Users
// Add moderators.
$moderatorRole = UserRole::factory()->moderator()->create(); $moderatorRole = UserRole::factory()->moderator()->create();
User::factory(5)->for($moderatorRole, 'role')->create(); User::factory($counts['moderator'])->for($moderatorRole, 'role')->create();
// Add users // Users
progress( progress(
label: 'adding users...', label: 'Adding Users...',
steps: $userCount, steps: $counts['user'],
callback: fn () => User::factory()->create() callback: fn () => User::factory()->create()
); );
// get all users // All Users
$allUsers = User::all(); $allUsers = User::all();
// Add user follows /* We got a little ahead of ourselves here. This hasn't been merged yet!
// User Follows
progress( progress(
label: 'adding user follows ...', label: 'adding user follows ...',
steps: $allUsers, steps: $allUsers,
@ -73,18 +76,20 @@ class DatabaseSeeder extends Seeder
$user->following()->attach($following); $user->following()->attach($following);
} }
}); });
*/
// Mods
$mods = collect(progress( $mods = collect(progress(
label: 'adding mods...', label: 'Adding Mods...',
steps: $modCount, steps: $counts['mod'],
callback: fn () => Mod::factory()->recycle([$licenses])->create() callback: fn () => Mod::factory()->recycle([$licenses])->create()
)); ));
// attach users to mods // Attach users to mods
progress( progress(
label: 'attaching mod users ...', label: 'Attaching users to mods...',
steps: $mods, steps: $mods,
callback: function ($mod) use ($allUsers) { callback: function (Mod $mod, Progress $progress) use ($allUsers) {
$userIds = $allUsers->random(rand(1, 3))->pluck('id')->toArray(); $userIds = $allUsers->random(rand(1, 3))->pluck('id')->toArray();
$mod->users()->attach($userIds); $mod->users()->attach($userIds);
} }
@ -92,26 +97,40 @@ class DatabaseSeeder extends Seeder
// Add mod versions, assigning them to the mods we just created. // Add mod versions, assigning them to the mods we just created.
$modVersions = collect(progress( $modVersions = collect(progress(
label: 'adding mods versions ...', label: 'Adding Mod Versions...',
steps: $modVersionCount, steps: $counts['modVersion'],
callback: fn () => ModVersion::factory()->recycle([$mods, $spt_versions])->create() callback: fn () => ModVersion::factory()->recycle([$mods])->create()
)); ));
// Add ModDependencies to a subset of ModVersions. // Add mod dependencies to *some* mod versions.
progress( progress(
label: 'adding mods dependencies ...', label: 'Adding Mod Dependencies...',
steps: $modVersions, steps: $modVersions,
callback: function ($modVersion) use ($mods) { callback: function (ModVersion $modVersion, Progress $progress) use ($mods) {
$hasDependencies = rand(0, 100) < 30; // 30% chance to have dependencies // 70% chance to not have dependencies
if ($hasDependencies) { if (rand(0, 9) >= 3) {
$dependencyMods = $mods->random(rand(1, 3)); // 1 to 3 dependencies return;
foreach ($dependencyMods as $dependencyMod) { }
ModDependency::factory()->recycle([$modVersion, $dependencyMod])->create();
} // Choose 1-3 random mods to be dependencies.
$dependencyMods = $mods->random(rand(1, 3));
foreach ($dependencyMods as $dependencyMod) {
ModDependency::factory()->recycle([$modVersion, $dependencyMod])->create();
} }
} }
); );
$this->command->outputComponents()->success('Database seeded'); $this->command->outputComponents()->success('Initial seeding complete');
Artisan::call('app:search-sync');
Artisan::call('app:resolve-versions');
Artisan::call('app:count-mods');
Artisan::call('app:update-downloads');
$this->command->outputComponents()->warn('Jobs added to queue. Ensure Horizon is running!');
Artisan::call('cache:clear');
$this->command->outputComponents()->info('Cache cleared');
$this->command->outputComponents()->success('Database seeding complete');
} }
} }