118 lines
4.7 KiB
PHP
118 lines
4.7 KiB
PHP
<?php
|
||
|
||
namespace Database\Seeders;
|
||
|
||
use App\Models\Emotion;
|
||
use App\Models\Event;
|
||
use App\Models\Photo;
|
||
use App\Models\PhotoLike;
|
||
use App\Models\Task;
|
||
use App\Models\Tenant;
|
||
use Carbon\CarbonImmutable;
|
||
use Illuminate\Database\Seeder;
|
||
use Illuminate\Support\Facades\Storage;
|
||
use Illuminate\Support\Str;
|
||
|
||
class DemoAchievementsSeeder extends Seeder
|
||
{
|
||
public function run(): void
|
||
{
|
||
$event = Event::where('slug', 'demo-wedding-2025')->first();
|
||
$tenant = Tenant::where('slug', 'demo')->first();
|
||
|
||
if (! $event || ! $tenant) {
|
||
$this->command?->warn('Demo event/tenant missing – skipping DemoAchievementsSeeder');
|
||
return;
|
||
}
|
||
|
||
$tasks = Task::where('tenant_id', $tenant->id)->pluck('id')->all();
|
||
$emotions = Emotion::pluck('id')->all();
|
||
|
||
if ($tasks === [] || $emotions === []) {
|
||
$this->command?->warn('Tasks or emotions missing – skipping DemoAchievementsSeeder');
|
||
return;
|
||
}
|
||
|
||
$sourceFiles = collect(Storage::disk('public')->files('photos'))
|
||
->filter(fn ($path) => Str::endsWith(Str::lower($path), '.jpg'))
|
||
->values();
|
||
|
||
if ($sourceFiles->isEmpty()) {
|
||
$this->command?->warn('No demo photo files found – skipping DemoAchievementsSeeder');
|
||
return;
|
||
}
|
||
|
||
$blueprints = [
|
||
['guest' => 'Anna Mueller', 'photos' => 6, 'likes' => [12, 8, 5, 4, 2, 1], 'withTasks' => true],
|
||
['guest' => 'Max Schmidt', 'photos' => 4, 'likes' => [9, 7, 4, 2], 'withTasks' => true],
|
||
['guest' => 'Lisa Weber', 'photos' => 2, 'likes' => [3, 1], 'withTasks' => false],
|
||
['guest' => 'Tom Fischer', 'photos' => 1, 'likes' => [14], 'withTasks' => true],
|
||
['guest' => 'Team Brautparty', 'photos' => 5, 'likes' => [5, 4, 3, 3, 2], 'withTasks' => true],
|
||
];
|
||
|
||
$eventDate = $event->date ? CarbonImmutable::parse($event->date) : CarbonImmutable::now();
|
||
$baseDir = "events/{$event->id}/achievements";
|
||
Storage::disk('public')->makeDirectory($baseDir);
|
||
Storage::disk('public')->makeDirectory("{$baseDir}/thumbs");
|
||
|
||
$photoIndex = 0;
|
||
|
||
foreach ($blueprints as $groupIndex => $blueprint) {
|
||
for ($i = 0; $i < $blueprint['photos']; $i++) {
|
||
$source = $sourceFiles[$photoIndex % $sourceFiles->count()];
|
||
$photoIndex++;
|
||
|
||
$filename = Str::slug($blueprint['guest'] . '-' . $groupIndex . '-' . $i) . '.jpg';
|
||
$destPath = "{$baseDir}/{$filename}";
|
||
if (! Storage::disk('public')->exists($destPath)) {
|
||
Storage::disk('public')->copy($source, $destPath);
|
||
}
|
||
|
||
$thumbSource = str_replace('photos/', 'thumbnails/', $source);
|
||
$thumbDest = "{$baseDir}/thumbs/{$filename}";
|
||
if (Storage::disk('public')->exists($thumbSource)) {
|
||
Storage::disk('public')->copy($thumbSource, $thumbDest);
|
||
} else {
|
||
Storage::disk('public')->copy($source, $thumbDest);
|
||
}
|
||
|
||
$taskId = $blueprint['withTasks'] ? $tasks[($groupIndex + $i) % count($tasks)] : null;
|
||
$emotionId = $emotions[($groupIndex * 3 + $i) % count($emotions)];
|
||
$createdAt = $eventDate->addHours($groupIndex * 2 + $i);
|
||
$likes = $blueprint['likes'][$i] ?? 0;
|
||
|
||
$photo = Photo::updateOrCreate(
|
||
[
|
||
'tenant_id' => $tenant->id,
|
||
'event_id' => $event->id,
|
||
'guest_name' => $blueprint['guest'],
|
||
'file_path' => $destPath,
|
||
],
|
||
[
|
||
'task_id' => $taskId,
|
||
'emotion_id' => $emotionId,
|
||
'thumbnail_path' => $thumbDest,
|
||
'likes_count' => $likes,
|
||
'is_featured' => $i === 0,
|
||
'metadata' => ['demo' => true],
|
||
'created_at' => $createdAt,
|
||
'updated_at' => $createdAt,
|
||
]
|
||
);
|
||
|
||
PhotoLike::where('photo_id', $photo->id)->delete();
|
||
for ($like = 0; $like < min($likes, 15); $like++) {
|
||
PhotoLike::create([
|
||
'photo_id' => $photo->id,
|
||
'guest_name' => 'Guest_' . Str::random(6),
|
||
'ip_address' => '10.0.' . rand(0, 254) . '.' . rand(0, 254),
|
||
'created_at' => $createdAt->addMinutes($like * 3),
|
||
]);
|
||
}
|
||
}
|
||
}
|
||
|
||
$this->command?->info('Demo achievements seeded.');
|
||
}
|
||
}
|