photo visibility for demo events, hardened the demo mode. fixed dark/light mode toggle and notification bell toggle. fixed photo upload page sizes & header visibility.
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\Event;
|
||||
use App\Models\EventMediaAsset;
|
||||
use App\Models\EventPackage;
|
||||
use App\Models\EventType;
|
||||
use App\Models\Package;
|
||||
@@ -11,6 +12,7 @@ use App\Models\TaskCollection;
|
||||
use App\Models\Tenant;
|
||||
use App\Models\TenantPackage;
|
||||
use App\Models\User;
|
||||
use App\Services\Storage\EventStorageManager;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Arr;
|
||||
@@ -26,6 +28,11 @@ class SeedDemoSwitcherTenants extends Command
|
||||
|
||||
protected $description = 'Seeds demo tenants used by the DevTenantSwitcher (endcustomer + reseller profiles)';
|
||||
|
||||
public function __construct(private EventStorageManager $eventStorageManager)
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
if (! app()->environment(['local', 'development', 'demo'])) {
|
||||
@@ -88,20 +95,14 @@ class SeedDemoSwitcherTenants extends Command
|
||||
$photo->likes()->delete();
|
||||
$photoLikesDeleted += $deletedLikes;
|
||||
|
||||
if ($photo->thumbnail_path) {
|
||||
Storage::disk('public')->delete($photo->thumbnail_path);
|
||||
}
|
||||
|
||||
if ($photo->file_path) {
|
||||
Storage::disk('public')->delete($photo->file_path);
|
||||
}
|
||||
|
||||
$this->deleteDemoPhotoAssets($photo, $event);
|
||||
$photo->delete();
|
||||
$photosDeleted++;
|
||||
}
|
||||
|
||||
Storage::disk('public')->deleteDirectory("events/{$event->id}/gallery");
|
||||
Storage::disk('public')->deleteDirectory("events/{$event->id}/gallery/thumbs");
|
||||
$cleanupDisk = $this->eventStorageManager->getHotDiskForEvent($event);
|
||||
Storage::disk($cleanupDisk)->deleteDirectory("events/{$event->id}/gallery");
|
||||
Storage::disk($cleanupDisk)->deleteDirectory("events/{$event->id}/gallery/thumbs");
|
||||
|
||||
$event->taskCollections()->detach();
|
||||
$event->tasks()->detach();
|
||||
@@ -489,7 +490,7 @@ class SeedDemoSwitcherTenants extends Command
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->storePhotos($event, $photos);
|
||||
$this->storePhotos($event, $photos, $targetPerEvent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -528,10 +529,11 @@ class SeedDemoSwitcherTenants extends Command
|
||||
return Arr::get($data, 'photos', []);
|
||||
}
|
||||
|
||||
private function storePhotos(Event $event, array $photos): void
|
||||
private function storePhotos(Event $event, array $photos, int $targetPerEvent): void
|
||||
{
|
||||
$tenantId = $event->tenant_id;
|
||||
$storage = Storage::disk('public');
|
||||
$disk = $this->eventStorageManager->getHotDiskForEvent($event);
|
||||
$storage = Storage::disk($disk);
|
||||
$storage->makeDirectory("events/{$event->id}/gallery");
|
||||
$storage->makeDirectory("events/{$event->id}/gallery/thumbs");
|
||||
|
||||
@@ -540,11 +542,11 @@ class SeedDemoSwitcherTenants extends Command
|
||||
->get();
|
||||
|
||||
foreach ($demoPhotos as $photo) {
|
||||
$storage->delete([$photo->file_path, $photo->thumbnail_path]);
|
||||
$this->deleteDemoPhotoAssets($photo, $event);
|
||||
$photo->delete();
|
||||
}
|
||||
|
||||
$limit = min(count($photos), (int) $this->option('photos-per-event'));
|
||||
$limit = min(count($photos), $targetPerEvent);
|
||||
for ($i = 0; $i < $limit; $i++) {
|
||||
$photo = $photos[$i];
|
||||
$src = $photo['src'] ?? [];
|
||||
@@ -561,16 +563,20 @@ class SeedDemoSwitcherTenants extends Command
|
||||
$filePath = "events/{$event->id}/gallery/{$filename}";
|
||||
$thumbPath = "events/{$event->id}/gallery/thumbs/{$thumbFilename}";
|
||||
|
||||
$originalBody = null;
|
||||
$thumbBody = null;
|
||||
try {
|
||||
$imageResponse = Http::get($originalUrl);
|
||||
if ($imageResponse->ok()) {
|
||||
$storage->put($filePath, $imageResponse->body());
|
||||
$originalBody = $imageResponse->body();
|
||||
$storage->put($filePath, $originalBody);
|
||||
}
|
||||
|
||||
if ($thumbUrl) {
|
||||
$thumbResponse = Http::get($thumbUrl);
|
||||
if ($thumbResponse->ok()) {
|
||||
$storage->put($thumbPath, $thumbResponse->body());
|
||||
$thumbBody = $thumbResponse->body();
|
||||
$storage->put($thumbPath, $thumbBody);
|
||||
}
|
||||
}
|
||||
} catch (\Throwable $exception) {
|
||||
@@ -581,7 +587,7 @@ class SeedDemoSwitcherTenants extends Command
|
||||
|
||||
$timestamp = Carbon::parse($event->date ?? Carbon::now())->addHours($i);
|
||||
|
||||
Photo::updateOrCreate(
|
||||
$photoRecord = Photo::updateOrCreate(
|
||||
[
|
||||
'tenant_id' => $tenantId,
|
||||
'event_id' => $event->id,
|
||||
@@ -592,11 +598,36 @@ class SeedDemoSwitcherTenants extends Command
|
||||
'guest_name' => 'Demo Guest '.($i + 1),
|
||||
'likes_count' => rand(1, 25),
|
||||
'is_featured' => $i === 0,
|
||||
'status' => 'approved',
|
||||
'mime_type' => 'image/jpeg',
|
||||
'size' => $originalBody ? strlen($originalBody) : null,
|
||||
'metadata' => ['demo' => true, 'source' => 'pexels'],
|
||||
'created_at' => $timestamp,
|
||||
'updated_at' => $timestamp,
|
||||
]
|
||||
);
|
||||
|
||||
$originalAsset = $this->eventStorageManager->recordAsset($event, $disk, $filePath, [
|
||||
'variant' => 'original',
|
||||
'mime_type' => 'image/jpeg',
|
||||
'size_bytes' => $originalBody ? strlen($originalBody) : null,
|
||||
'checksum' => $originalBody ? hash('sha256', $originalBody) : null,
|
||||
'photo_id' => $photoRecord->id,
|
||||
]);
|
||||
|
||||
if ($thumbBody) {
|
||||
$this->eventStorageManager->recordAsset($event, $disk, $thumbPath, [
|
||||
'variant' => 'thumbnail',
|
||||
'mime_type' => 'image/jpeg',
|
||||
'size_bytes' => strlen($thumbBody),
|
||||
'photo_id' => $photoRecord->id,
|
||||
'meta' => [
|
||||
'source_variant_id' => $originalAsset->id,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
$photoRecord->update(['media_asset_id' => $originalAsset->id]);
|
||||
}
|
||||
|
||||
EventPackage::where('event_id', $event->id)->update([
|
||||
@@ -606,4 +637,31 @@ class SeedDemoSwitcherTenants extends Command
|
||||
|
||||
$this->info("Seeded {$limit} photos for {$event->slug}");
|
||||
}
|
||||
|
||||
private function deleteDemoPhotoAssets(Photo $photo, Event $event): void
|
||||
{
|
||||
$fallbackDisk = $this->eventStorageManager->getHotDiskForEvent($event);
|
||||
$assets = EventMediaAsset::where('photo_id', $photo->id)->get();
|
||||
|
||||
foreach ($assets as $asset) {
|
||||
$assetDisk = $asset->disk ?: $fallbackDisk;
|
||||
if (! config("filesystems.disks.{$assetDisk}")) {
|
||||
$assetDisk = $fallbackDisk;
|
||||
}
|
||||
|
||||
if ($asset->path) {
|
||||
Storage::disk($assetDisk)->delete($asset->path);
|
||||
}
|
||||
|
||||
$asset->delete();
|
||||
}
|
||||
|
||||
if ($photo->file_path) {
|
||||
Storage::disk($fallbackDisk)->delete($photo->file_path);
|
||||
}
|
||||
|
||||
if ($photo->thumbnail_path) {
|
||||
Storage::disk($fallbackDisk)->delete($photo->thumbnail_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1785,6 +1785,8 @@ class EventPublicController extends BaseController
|
||||
$this->joinTokenService->incrementUsage($joinToken);
|
||||
}
|
||||
|
||||
$demoReadOnly = (bool) Arr::get($joinToken?->metadata ?? [], 'demo_read_only', false);
|
||||
|
||||
return response()->json([
|
||||
'id' => $event->id,
|
||||
'slug' => $event->slug,
|
||||
@@ -1794,6 +1796,7 @@ class EventPublicController extends BaseController
|
||||
'updated_at' => $event->updated_at,
|
||||
'type' => $eventTypeData,
|
||||
'join_token' => $joinToken?->token,
|
||||
'demo_read_only' => $demoReadOnly,
|
||||
'photobooth_enabled' => (bool) ($event->photoboothSetting?->enabled),
|
||||
'branding' => $branding,
|
||||
'guest_upload_visibility' => Arr::get($event->settings ?? [], 'guest_upload_visibility', 'review'),
|
||||
@@ -2751,6 +2754,28 @@ class EventPublicController extends BaseController
|
||||
|
||||
[$event, $joinToken] = $result;
|
||||
$eventId = $event->id;
|
||||
$demoReadOnly = (bool) Arr::get($joinToken?->metadata ?? [], 'demo_read_only', false);
|
||||
|
||||
if ($demoReadOnly) {
|
||||
$this->recordTokenEvent(
|
||||
$joinToken,
|
||||
$request,
|
||||
'demo_read_only',
|
||||
['event_id' => $eventId],
|
||||
$token,
|
||||
Response::HTTP_FORBIDDEN
|
||||
);
|
||||
|
||||
return ApiError::response(
|
||||
'demo_read_only',
|
||||
'Demo mode',
|
||||
'Uploads are disabled in demo mode.',
|
||||
Response::HTTP_FORBIDDEN,
|
||||
[
|
||||
'event_id' => $eventId,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
$eventModel = Event::with([
|
||||
'tenant',
|
||||
|
||||
@@ -42,6 +42,7 @@ class EventJoinTokenService
|
||||
|
||||
public function revoke(EventJoinToken $joinToken, ?string $reason = null): EventJoinToken
|
||||
{
|
||||
unset($joinToken->plain_token);
|
||||
$joinToken->revoked_at = now();
|
||||
|
||||
if ($reason) {
|
||||
|
||||
Reference in New Issue
Block a user