behoben: ohne aufgabe kann die kamera nicht gestartet werden (offensichtlich kein fehler mit browserzugriff auf kamera!)

platz zu begrenzt im aufnahmemodus - vollbildmodus möglich? Menü und Kopfleiste ausblenden?
	Bild aus eigener galerie auswählen - Upload schlägt fehl (zu groß? evtl fehlende Rechte - aber browser hat rechte auf bilder und dateien!)
	hochgeladene bilder tauchen in der galerie nicht beim filter "Meine Bilder" auf - fotos werden auch nicht gezählt in den stats und achievements zeigen keinen fortschriftt.
	geteilte fotos: ruft man den Link auf, bekommt man die meldung "Link abgelaufen"
	der im startbildschirm gewählte name mit Umlauten (Sören) ist nach erneutem aufruf der pwa ohne umlaut (Sren).
Aufgabenseite verbessert (Zwischenstand)
This commit is contained in:
Codex Agent
2025-12-04 11:58:07 +01:00
parent 899e742c38
commit c73a3163c0
15 changed files with 776 additions and 610 deletions

View File

@@ -630,14 +630,22 @@ class EventPublicController extends BaseController
{
$guestNameParam = trim((string) $request->query('guest_name', ''));
$deviceIdHeader = (string) $request->headers->get('X-Device-Id', '');
$deviceId = substr(preg_replace('/[^A-Za-z0-9 _\-]/', '', $deviceIdHeader), 0, 120);
$candidate = $guestNameParam !== '' ? $guestNameParam : $deviceId;
$candidate = $guestNameParam !== '' ? $guestNameParam : $deviceIdHeader;
$normalized = $this->normalizeGuestIdentifier($candidate);
if ($candidate === '') {
if ($normalized === '') {
return null;
}
return substr(preg_replace('/[^A-Za-z0-9 _\-]/', '', $candidate), 0, 120);
return $normalized;
}
private function normalizeGuestIdentifier(string $value): string
{
$cleaned = preg_replace('/[^\p{L}\p{N}\s_\-]/u', '', $value) ?? '';
$trimmed = trim(mb_substr($cleaned, 0, 120));
return $trimmed;
}
private function buildAchievementsPayload(int $eventId, ?string $guestIdentifier, array $fallbacks): array
@@ -1380,7 +1388,7 @@ class EventPublicController extends BaseController
$photo = $shareLink->photo;
$event = $photo->event;
if (! $event || $photo->status !== 'approved') {
if (! $event || in_array($photo->status, ['hidden', 'rejected'], true)) {
return ApiError::response(
'photo_not_shareable',
'Photo Not Shareable',
@@ -1399,14 +1407,23 @@ class EventPublicController extends BaseController
}
}
$emotionName = null;
if ($photo->emotion) {
$emotionName = $this->translateLocalized($photo->emotion->name, app()->getLocale(), '');
if ($emotionName === '') {
$emotionName = is_string($photo->emotion->name) ? $photo->emotion->name : null;
}
}
$photoResource = [
'id' => $photo->id,
'title' => $taskTitle,
'emotion' => $photo->emotion ? [
'name' => $photo->emotion->name,
'name' => $emotionName,
'emoji' => $photo->emotion->emoji,
] : null,
'likes_count' => $photo->likes()->count(),
'created_at' => $photo->created_at?->toIso8601String(),
'image_urls' => [
'thumbnail' => $this->makeShareAssetUrl($shareLink, 'thumbnail'),
'full' => $this->makeShareAssetUrl($shareLink, 'full'),
@@ -1453,7 +1470,7 @@ class EventPublicController extends BaseController
$photo = $shareLink->photo;
$event = $photo->event;
if (! $event || $photo->status !== 'approved') {
if (! $event || in_array($photo->status, ['hidden', 'rejected'], true)) {
return ApiError::response(
'photo_not_shareable',
'Photo Not Shareable',
@@ -2165,8 +2182,7 @@ class EventPublicController extends BaseController
private function resolveDeviceIdentifier(Request $request): string
{
$deviceId = (string) $request->headers->get('X-Device-Id', '');
$normalized = preg_replace('/[^A-Za-z0-9 _\-]/', '', $deviceId) ?? '';
$normalized = trim(substr($normalized, 0, 120));
$normalized = $this->normalizeGuestIdentifier($deviceId);
return $normalized !== '' ? $normalized : 'anonymous';
}
@@ -2634,6 +2650,7 @@ class EventPublicController extends BaseController
'thumbnail_path' => $thumbUrl,
'likes_count' => 0,
'ingest_source' => Photo::SOURCE_GUEST_PWA,
'status' => 'approved',
// Handle emotion_id: prefer explicit ID, fallback to slug lookup, then default
'emotion_id' => $this->resolveEmotionId($validated, $eventId),

View File

@@ -244,7 +244,7 @@ class PhotoController extends Controller
'thumbnail_path' => $watermarkedThumb,
'width' => null, // Filled below
'height' => null,
'status' => 'pending', // Requires moderation
'status' => 'approved',
'uploader_id' => null,
'ip_address' => $request->ip(),
'user_agent' => $request->userAgent(),