event photo wasserzeichen umgesetzt. Event admins können eigene einsetzen (als branding) falls das Paket es erlaubt. der Super Admin kann für die günstigen Pakete eigene Wasserzeichen erzwingen
This commit is contained in:
@@ -23,6 +23,7 @@ use App\Services\PushSubscriptionService;
|
||||
use App\Services\Storage\EventStorageManager;
|
||||
use App\Support\ApiError;
|
||||
use App\Support\ImageHelper;
|
||||
use App\Support\WatermarkConfigResolver;
|
||||
use Carbon\Carbon;
|
||||
use Carbon\CarbonImmutable;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -877,14 +878,32 @@ class EventPublicController extends BaseController
|
||||
return $fallback;
|
||||
}
|
||||
|
||||
private function determineBrandingAllowed(Event $event): bool
|
||||
{
|
||||
return WatermarkConfigResolver::determineBrandingAllowed($event);
|
||||
}
|
||||
|
||||
private function determineWatermarkPolicy(Event $event): string
|
||||
{
|
||||
return WatermarkConfigResolver::determinePolicy($event);
|
||||
}
|
||||
|
||||
private function resolveWatermarkConfig(Event $event): array
|
||||
{
|
||||
return WatermarkConfigResolver::resolve($event);
|
||||
}
|
||||
|
||||
private function buildGalleryBranding(Event $event): array
|
||||
{
|
||||
$defaultPrimary = '#f43f5e';
|
||||
$defaultSecondary = '#fb7185';
|
||||
$defaultBackground = '#ffffff';
|
||||
|
||||
$eventBranding = Arr::get($event->settings, 'branding', []);
|
||||
$tenantBranding = Arr::get($event->tenant?->settings, 'branding', []);
|
||||
$event->loadMissing('eventPackage.package', 'tenant');
|
||||
$brandingAllowed = $this->determineBrandingAllowed($event);
|
||||
|
||||
$eventBranding = $brandingAllowed ? Arr::get($event->settings, 'branding', []) : [];
|
||||
$tenantBranding = $brandingAllowed ? Arr::get($event->tenant?->settings, 'branding', []) : [];
|
||||
|
||||
return [
|
||||
'primary_color' => Arr::get($eventBranding, 'primary_color')
|
||||
@@ -1239,6 +1258,7 @@ class EventPublicController extends BaseController
|
||||
$variantPreference = $variant === 'thumbnail'
|
||||
? ['thumbnail', 'original']
|
||||
: ['original'];
|
||||
$preferOriginals = (bool) ($event->settings['watermark_serve_originals'] ?? false);
|
||||
|
||||
return $this->streamGalleryPhoto($event, $photo, $variantPreference, 'inline');
|
||||
}
|
||||
@@ -1360,8 +1380,11 @@ class EventPublicController extends BaseController
|
||||
$branding = $this->buildGalleryBranding($event);
|
||||
$fontFamily = Arr::get($event->settings, 'branding.font_family')
|
||||
?? Arr::get($event->tenant?->settings, 'branding.font_family');
|
||||
$logoUrl = Arr::get($event->settings, 'branding.logo_url')
|
||||
?? Arr::get($event->tenant?->settings, 'branding.logo_url');
|
||||
$brandingAllowed = $this->determineBrandingAllowed($event);
|
||||
$logoUrl = $brandingAllowed
|
||||
? (Arr::get($event->settings, 'branding.logo_url')
|
||||
?? Arr::get($event->tenant?->settings, 'branding.logo_url'))
|
||||
: null;
|
||||
|
||||
if ($joinToken) {
|
||||
$this->joinTokenService->incrementUsage($joinToken);
|
||||
@@ -1430,6 +1453,9 @@ class EventPublicController extends BaseController
|
||||
|
||||
$package = $eventPackage->package;
|
||||
$summary = $this->packageLimitEvaluator->summarizeEventPackage($eventPackage);
|
||||
$watermarkPolicy = $this->determineWatermarkPolicy($event);
|
||||
$brandingAllowed = $this->determineBrandingAllowed($event);
|
||||
$watermark = $this->resolveWatermarkConfig($event);
|
||||
|
||||
return response()->json([
|
||||
'id' => $eventPackage->id,
|
||||
@@ -1441,18 +1467,23 @@ class EventPublicController extends BaseController
|
||||
'max_photos' => $package?->max_photos,
|
||||
'max_guests' => $package?->max_guests,
|
||||
'gallery_days' => $package?->gallery_days,
|
||||
'watermark_policy' => $watermarkPolicy,
|
||||
'branding_allowed' => $brandingAllowed,
|
||||
],
|
||||
'used_photos' => (int) $eventPackage->used_photos,
|
||||
'used_guests' => (int) $eventPackage->used_guests,
|
||||
'expires_at' => $eventPackage->gallery_expires_at?->toIso8601String(),
|
||||
'limits' => $summary,
|
||||
'watermark' => $watermark,
|
||||
])->header('Cache-Control', 'no-store');
|
||||
}
|
||||
|
||||
private function streamGalleryPhoto(Event $event, Photo $record, array $variantPreference, string $disposition)
|
||||
{
|
||||
$preferOriginals = (bool) ($event->settings['watermark_serve_originals'] ?? false);
|
||||
|
||||
foreach ($variantPreference as $variant) {
|
||||
[$disk, $path, $mime] = $this->resolvePhotoVariant($record, $variant);
|
||||
[$disk, $path, $mime] = $this->resolvePhotoVariant($record, $variant, $preferOriginals);
|
||||
|
||||
if (! $path) {
|
||||
continue;
|
||||
@@ -1550,18 +1581,24 @@ class EventPublicController extends BaseController
|
||||
);
|
||||
}
|
||||
|
||||
private function resolvePhotoVariant(Photo $record, string $variant): array
|
||||
private function resolvePhotoVariant(Photo $record, string $variant, bool $preferOriginals = false): array
|
||||
{
|
||||
if ($variant === 'thumbnail') {
|
||||
$asset = EventMediaAsset::where('photo_id', $record->id)->where('variant', 'thumbnail')->first();
|
||||
$watermarked = $preferOriginals
|
||||
? null
|
||||
: EventMediaAsset::where('photo_id', $record->id)->where('variant', 'watermarked_thumbnail')->first();
|
||||
$disk = $asset?->disk ?? $record->mediaAsset?->disk;
|
||||
$path = $asset?->path ?? ($record->thumbnail_path ?: $record->file_path);
|
||||
$mime = $asset?->mime_type ?? 'image/jpeg';
|
||||
$path = $watermarked?->path ?? $asset?->path ?? ($record->thumbnail_path ?: $record->file_path);
|
||||
$mime = $watermarked?->mime_type ?? $asset?->mime_type ?? 'image/jpeg';
|
||||
} else {
|
||||
$asset = $record->mediaAsset ?? EventMediaAsset::where('photo_id', $record->id)->where('variant', 'original')->first();
|
||||
$watermarked = $preferOriginals
|
||||
? null
|
||||
: EventMediaAsset::where('photo_id', $record->id)->where('variant', 'watermarked')->first();
|
||||
$asset = $record->mediaAsset ?? $watermarked ?? EventMediaAsset::where('photo_id', $record->id)->where('variant', 'original')->first();
|
||||
$disk = $asset?->disk ?? $record->mediaAsset?->disk;
|
||||
$path = $asset?->path ?? ($record->file_path ?? null);
|
||||
$mime = $asset?->mime_type ?? ($record->mime_type ?? 'image/jpeg');
|
||||
$path = $watermarked?->path ?? $asset?->path ?? ($record->file_path ?? null);
|
||||
$mime = $watermarked?->mime_type ?? $asset?->mime_type ?? ($record->mime_type ?? 'image/jpeg');
|
||||
}
|
||||
|
||||
return [
|
||||
@@ -2363,7 +2400,7 @@ class EventPublicController extends BaseController
|
||||
$file = $validated['photo'];
|
||||
$disk = $this->eventStorageManager->getHotDiskForEvent($eventModel);
|
||||
$path = Storage::disk($disk)->putFile("events/{$eventId}/photos", $file);
|
||||
$url = $this->resolveDiskUrl($disk, $path);
|
||||
$watermarkConfig = WatermarkConfigResolver::resolve($eventModel);
|
||||
|
||||
// Generate thumbnail (JPEG) under photos/thumbs
|
||||
$baseName = pathinfo($path, PATHINFO_FILENAME);
|
||||
@@ -2371,7 +2408,27 @@ class EventPublicController extends BaseController
|
||||
$thumbPath = ImageHelper::makeThumbnailOnDisk($disk, $path, $thumbRel, 640, 82);
|
||||
$thumbUrl = $thumbPath
|
||||
? $this->resolveDiskUrl($disk, $thumbPath)
|
||||
: $url;
|
||||
: $this->resolveDiskUrl($disk, $path);
|
||||
|
||||
// Create watermarked copies (non-destructive).
|
||||
$watermarkedPath = $path;
|
||||
$watermarkedThumb = $thumbPath ?: $path;
|
||||
if ($watermarkConfig['type'] !== 'none' && ! empty($watermarkConfig['asset']) && ! ($watermarkConfig['serve_originals'] ?? false)) {
|
||||
$watermarkedPath = ImageHelper::copyWithWatermark($disk, $path, "events/{$eventId}/photos/watermarked/{$baseName}.{$file->getClientOriginalExtension()}", $watermarkConfig) ?? $path;
|
||||
if ($thumbPath) {
|
||||
$watermarkedThumb = ImageHelper::copyWithWatermark(
|
||||
$disk,
|
||||
$thumbPath,
|
||||
"events/{$eventId}/photos/watermarked/{$baseName}_thumb.jpg",
|
||||
$watermarkConfig
|
||||
) ?? $thumbPath;
|
||||
} else {
|
||||
$watermarkedThumb = $watermarkedPath;
|
||||
}
|
||||
}
|
||||
|
||||
$url = $this->resolveDiskUrl($disk, $watermarkedPath);
|
||||
$thumbUrl = $this->resolveDiskUrl($disk, $watermarkedThumb);
|
||||
|
||||
$photoId = DB::table('photos')->insertGetId([
|
||||
'event_id' => $eventId,
|
||||
@@ -2390,16 +2447,35 @@ class EventPublicController extends BaseController
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
$storedPath = Storage::disk($disk)->path($path);
|
||||
$storedSize = Storage::disk($disk)->exists($path) ? Storage::disk($disk)->size($path) : $file->getSize();
|
||||
$asset = $this->eventStorageManager->recordAsset($eventModel, $disk, $path, [
|
||||
'variant' => 'original',
|
||||
'mime_type' => $file->getClientMimeType(),
|
||||
'size_bytes' => $file->getSize(),
|
||||
'checksum' => hash_file('sha256', $file->getRealPath()),
|
||||
'size_bytes' => $storedSize,
|
||||
'checksum' => file_exists($storedPath) ? hash_file('sha256', $storedPath) : hash_file('sha256', $file->getRealPath()),
|
||||
'status' => 'hot',
|
||||
'processed_at' => now(),
|
||||
'photo_id' => $photoId,
|
||||
]);
|
||||
|
||||
$watermarkedAsset = null;
|
||||
if ($watermarkedPath !== $path) {
|
||||
$watermarkedAsset = $this->eventStorageManager->recordAsset($eventModel, $disk, $watermarkedPath, [
|
||||
'variant' => 'watermarked',
|
||||
'mime_type' => $file->getClientMimeType(),
|
||||
'size_bytes' => Storage::disk($disk)->exists($watermarkedPath)
|
||||
? Storage::disk($disk)->size($watermarkedPath)
|
||||
: null,
|
||||
'status' => 'hot',
|
||||
'processed_at' => now(),
|
||||
'photo_id' => $photoId,
|
||||
'meta' => [
|
||||
'source_variant_id' => $asset->id,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
if ($thumbPath) {
|
||||
$this->eventStorageManager->recordAsset($eventModel, $disk, $thumbPath, [
|
||||
'variant' => 'thumbnail',
|
||||
@@ -2415,6 +2491,21 @@ class EventPublicController extends BaseController
|
||||
],
|
||||
]);
|
||||
}
|
||||
if ($watermarkedThumb !== $thumbPath) {
|
||||
$this->eventStorageManager->recordAsset($eventModel, $disk, $watermarkedThumb, [
|
||||
'variant' => 'watermarked_thumbnail',
|
||||
'mime_type' => 'image/jpeg',
|
||||
'status' => 'hot',
|
||||
'processed_at' => now(),
|
||||
'photo_id' => $photoId,
|
||||
'size_bytes' => Storage::disk($disk)->exists($watermarkedThumb)
|
||||
? Storage::disk($disk)->size($watermarkedThumb)
|
||||
: null,
|
||||
'meta' => [
|
||||
'source_variant_id' => $watermarkedAsset?->id ?? $asset->id,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
DB::table('photos')
|
||||
->where('id', $photoId)
|
||||
|
||||
Reference in New Issue
Block a user