clupilot/app/database/seeders/DatabaseSeeder.php

154 lines
6.0 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\Activity;
use App\Models\Backup;
use App\Models\Certificate;
use App\Models\Cluster;
use App\Models\Cron;
use App\Models\Invitation;
use App\Models\SecurityEvent;
use App\Models\Server;
use App\Models\Site;
use App\Models\TeamMember;
use App\Models\User;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
/* ───── primary user (matches template) ───── */
$owner = User::updateOrCreate(
['email' => 'm.weber@acme-cluster.de'],
[
'name' => 'Marie Weber',
'password' => bcrypt('clupilot'),
'email_verified_at' => now(),
]
);
TeamMember::updateOrCreate(
['user_id' => $owner->id],
[
'role' => 'owner',
'scope' => 'All clusters',
'two_fa_enabled' => true,
'last_active_at' => now(),
]
);
/* ───── dev login (kept from previous seed) ───── */
User::updateOrCreate(
['email' => 'admin@clupilot.test'],
[
'name' => 'Admin',
'password' => bcrypt('clupilot'),
'email_verified_at' => now(),
]
);
/* ───── 1 cluster: Acme Cluster ───── */
$cluster = Cluster::firstOrCreate(
['slug' => 'acme-cluster'],
[
'name' => 'Acme Cluster',
'region' => 'eu-central-1',
'env' => 'prod',
'monthly_price_cents' => 24900,
'node_count' => 6,
'backups_enabled' => true,
]
);
/* ───── 6 servers ───── */
$servers = [
['name' => 'eu-prod-01', 'region' => 'eu-central-1', 'flag' => '🇩🇪', 'env' => 'prod', 'status' => 'ok', 'cpu' => 42, 'ram' => 58, 'disk' => 47],
['name' => 'eu-prod-02', 'region' => 'eu-central-1', 'flag' => '🇩🇪', 'env' => 'prod', 'status' => 'ok', 'cpu' => 36, 'ram' => 64, 'disk' => 51],
['name' => 'edge-ams', 'region' => 'eu-west-1', 'flag' => '🇳🇱', 'env' => 'edge', 'status' => 'ok', 'cpu' => 21, 'ram' => 45, 'disk' => 38],
['name' => 'us-east-01', 'region' => 'us-east-1', 'flag' => '🇺🇸', 'env' => 'prod', 'status' => 'warn', 'cpu' => 78, 'ram' => 71, 'disk' => 54],
['name' => 'staging', 'region' => 'eu-central-1', 'flag' => '🇩🇪', 'env' => 'staging', 'status' => 'ok', 'cpu' => 18, 'ram' => 32, 'disk' => 22],
['name' => 'ap-bom-01', 'region' => 'ap-south-1', 'flag' => '🇮🇳', 'env' => 'prod', 'status' => 'ok', 'cpu' => 28, 'ram' => 52, 'disk' => 43],
];
$serverModels = [];
foreach ($servers as $s) {
$serverModels[] = Server::firstOrCreate(
['name' => $s['name']],
[
'cluster_id' => $cluster->id,
'region' => $s['region'],
'country_flag' => $s['flag'],
'env' => $s['env'],
'cpu_cores' => 8,
'ram_gb' => 32,
'disk_gb' => 320,
'cpu_load_pct' => $s['cpu'],
'ram_used_pct' => $s['ram'],
'disk_used_pct' => $s['disk'],
'status' => $s['status'],
'ip' => fake()->ipv4(),
]
);
}
/* ───── 87 sites distributed across servers ───── */
$distribution = [23, 19, 14, 18, 6, 7]; // sums to 87
foreach ($serverModels as $i => $server) {
$target = $distribution[$i] ?? 5;
$existing = $server->sites()->count();
if ($existing < $target) {
Site::factory()->count($target - $existing)
->create(['server_id' => $server->id]);
}
}
$allSites = Site::query()->get();
/* ───── Certificates ───── */
foreach ($allSites as $site) {
if (! $site->certificate) {
Certificate::factory()->create([
'site_id' => $site->id,
'domain' => '*.' . $site->domain,
]);
}
}
/* ───── Backups (sample) ───── */
$backupSites = $allSites->random(min(28, $allSites->count()));
foreach ($backupSites as $site) {
Backup::factory()->count(rand(2, 6))->create(['site_id' => $site->id]);
}
/* ───── Crons (sample) ───── */
foreach ($allSites->random(min(20, $allSites->count())) as $site) {
Cron::factory()->count(rand(1, 4))->create(['site_id' => $site->id]);
}
/* ───── Security events: 128 in last 24h (matches template stat) ───── */
SecurityEvent::factory()->count(128)
->create(['site_id' => $allSites->random()->id]);
/* ───── Team members (4 + owner) ───── */
if (TeamMember::count() < 5) {
User::factory()->count(4)->create()->each(function (User $u) {
TeamMember::factory()->create(['user_id' => $u->id]);
});
}
/* ───── Pending invitations ───── */
if (Invitation::count() < 3) {
Invitation::factory()->count(3)->create([
'invited_by_user_id' => $owner->id,
'accepted_at' => null,
]);
}
/* ───── Activity feed (30 recent items) ───── */
Activity::factory()->count(30)->create(['user_id' => $owner->id]);
}
}