Update admin PWA events, branding, and packages
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-01-19 11:35:38 +01:00
parent 926bc7d070
commit fbff2afa3e
43 changed files with 6846 additions and 6323 deletions

View File

@@ -1298,7 +1298,7 @@ class EventPublicController extends BaseController
);
}
$diskName = config('filesystems.default', 'public');
$diskName = 'public';
try {
$storage = Storage::disk($diskName);

View File

@@ -453,7 +453,7 @@ class EventController extends Controller
}
if ($assetDataUrl && $mode === 'custom' && $brandingAllowed) {
if (! preg_match('/^data:image\\/(png|webp|jpe?g);base64,(.+)$/i', $assetDataUrl, $matches)) {
if (! preg_match('/^data:image\\/(png|webp|jpe?g|svg\\+xml);base64,(.+)$/i', $assetDataUrl, $matches)) {
throw ValidationException::withMessages([
'settings.watermark.asset_data_url' => __('Ungültiges Wasserzeichen-Bild.'),
]);
@@ -473,7 +473,12 @@ class EventController extends Controller
]);
}
$extension = str_starts_with(strtolower($matches[1]), 'jp') ? 'jpg' : strtolower($matches[1]);
$mime = strtolower($matches[1]);
$extension = match (true) {
str_starts_with($mime, 'jp') => 'jpg',
str_starts_with($mime, 'svg') => 'svg',
default => $mime,
};
$path = sprintf('branding/watermarks/event-%s.%s', $event->id, $extension);
Storage::disk('public')->put($path, $decoded);
$assetPath = $path;

View File

@@ -39,7 +39,9 @@ class TenantPackageController extends Controller
$activePackage = $tenant->activeResellerPackage?->load('package');
if ($activePackage instanceof TenantPackage) {
if (! ($activePackage instanceof TenantPackage)) {
$activePackage = $packages->firstWhere('active', true);
} else {
$this->hydratePackageSnapshot($activePackage, $usageEventPackage);
}

View File

@@ -54,6 +54,8 @@ class EventStoreRequest extends FormRequest
'settings.branding' => ['nullable', 'array'],
'settings.branding.*' => ['nullable'],
'settings.engagement_mode' => ['nullable', Rule::in(['tasks', 'photo_only'])],
'settings.guest_downloads_enabled' => ['nullable', 'boolean'],
'settings.guest_sharing_enabled' => ['nullable', 'boolean'],
'settings.guest_upload_visibility' => ['nullable', Rule::in(['review', 'immediate'])],
'settings.live_show' => ['nullable', 'array'],
'settings.live_show.moderation_mode' => ['nullable', Rule::in(['off', 'manual', 'trusted_only'])],

View File

@@ -8,6 +8,7 @@ use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Http\Resources\MissingValue;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\URL;
use function app;
@@ -18,6 +19,7 @@ class EventResource extends JsonResource
$tenantId = $request->attributes->get('tenant_id');
$showSensitive = $this->tenant_id === $tenantId;
$settings = is_array($this->settings) ? $this->settings : [];
$settings = $this->attachWatermarkAssetUrl($settings);
$eventPackage = null;
$memberPermissions = null;
@@ -97,6 +99,64 @@ class EventResource extends JsonResource
];
}
/**
* @param array<string, mixed> $settings
* @return array<string, mixed>
*/
protected function attachWatermarkAssetUrl(array $settings): array
{
$watermark = Arr::get($settings, 'watermark');
$base = config('watermark.base', []);
$base = is_array($base) ? $base : [];
if (! is_array($watermark)) {
$watermark = [];
}
$mode = $watermark['mode'] ?? null;
if (! is_string($mode) || $mode === '') {
$mode = 'base';
$watermark['mode'] = $mode;
}
if ($mode !== 'off') {
foreach (['position', 'opacity', 'scale', 'padding', 'offset_x', 'offset_y'] as $key) {
if (! array_key_exists($key, $watermark) && array_key_exists($key, $base)) {
$watermark[$key] = $base[$key];
}
}
}
$asset = $watermark['asset'] ?? null;
if ((! is_string($asset) || $asset === '') && $mode !== 'off') {
$asset = $base['asset'] ?? null;
if (is_string($asset) && $asset !== '') {
$watermark['asset'] = $asset;
}
}
if (! is_string($asset) || $asset === '') {
$settings['watermark'] = $watermark;
return $settings;
}
$normalized = ltrim($asset, '/');
if (str_starts_with($normalized, 'storage/')) {
$normalized = substr($normalized, strlen('storage/'));
}
$watermark['asset_url'] = URL::temporarySignedRoute(
'api.v1.branding.asset',
now()->addSeconds(3600),
['path' => $normalized]
);
$settings['watermark'] = $watermark;
return $settings;
}
protected function formatAddons(?\App\Models\EventPackage $eventPackage): array
{
if (! $eventPackage) {