feat: automate guest notification triggers
This commit is contained in:
@@ -5,6 +5,8 @@ namespace App\Http\Controllers\Api;
|
||||
use App\Enums\GuestNotificationAudience;
|
||||
use App\Enums\GuestNotificationDeliveryStatus;
|
||||
use App\Enums\GuestNotificationState;
|
||||
use App\Enums\GuestNotificationType;
|
||||
use App\Events\GuestPhotoUploaded;
|
||||
use App\Models\Event;
|
||||
use App\Models\EventJoinToken;
|
||||
use App\Models\EventMediaAsset;
|
||||
@@ -1765,6 +1767,62 @@ class EventPublicController extends BaseController
|
||||
];
|
||||
}
|
||||
|
||||
private function notifyDeviceUploadLimit(Event $event, string $guestIdentifier, string $token): void
|
||||
{
|
||||
$title = 'Upload-Limit erreicht';
|
||||
$body = 'Du hast bereits 50 Fotos hochgeladen. Wir speichern deine Warteschlange – bitte lösche zuerst alte Uploads.';
|
||||
|
||||
$this->guestNotificationService->createNotification(
|
||||
$event,
|
||||
GuestNotificationType::UPLOAD_ALERT,
|
||||
$title,
|
||||
$body,
|
||||
[
|
||||
'audience_scope' => GuestNotificationAudience::GUEST,
|
||||
'target_identifier' => $guestIdentifier,
|
||||
'payload' => [
|
||||
'cta' => [
|
||||
'label' => 'Warteschlange öffnen',
|
||||
'href' => sprintf('/e/%s/queue', urlencode($token)),
|
||||
],
|
||||
],
|
||||
'expires_at' => now()->addHours(6),
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
private function notifyPhotoLimitReached(Event $event): void
|
||||
{
|
||||
$title = 'Uploads pausiert – Event-Limit erreicht';
|
||||
|
||||
if ($this->eventHasActiveNotification($event, GuestNotificationType::UPLOAD_ALERT, $title)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$body = 'Es können aktuell keine neuen Fotos hochgeladen werden. Wir informieren den Host – bleib kurz dran!';
|
||||
|
||||
$this->guestNotificationService->createNotification(
|
||||
$event,
|
||||
GuestNotificationType::UPLOAD_ALERT,
|
||||
$title,
|
||||
$body,
|
||||
[
|
||||
'audience_scope' => GuestNotificationAudience::ALL,
|
||||
'expires_at' => now()->addHours(3),
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
private function eventHasActiveNotification(Event $event, GuestNotificationType $type, string $title): bool
|
||||
{
|
||||
return GuestNotification::query()
|
||||
->where('event_id', $event->id)
|
||||
->where('type', $type->value)
|
||||
->where('title', $title)
|
||||
->where('status', GuestNotificationState::ACTIVE->value)
|
||||
->exists();
|
||||
}
|
||||
|
||||
private function resolveNotificationIdentifier(Request $request): string
|
||||
{
|
||||
$identifier = $this->determineGuestIdentifier($request);
|
||||
@@ -2142,6 +2200,10 @@ class EventPublicController extends BaseController
|
||||
|
||||
$violation = $this->packageLimitEvaluator->assessPhotoUpload($tenantModel, $eventId, $eventModel);
|
||||
if ($violation !== null) {
|
||||
if (($violation['code'] ?? null) === 'photo_limit_exceeded') {
|
||||
$this->notifyPhotoLimitReached($eventModel);
|
||||
}
|
||||
|
||||
return ApiError::response(
|
||||
$violation['code'],
|
||||
$violation['title'],
|
||||
@@ -2160,6 +2222,8 @@ class EventPublicController extends BaseController
|
||||
// Per-device cap per event (MVP: 50)
|
||||
$deviceCount = DB::table('photos')->where('event_id', $eventId)->where('guest_name', $deviceId)->count();
|
||||
if ($deviceCount >= 50) {
|
||||
$this->notifyDeviceUploadLimit($eventModel, $deviceId, $token);
|
||||
|
||||
$this->recordTokenEvent(
|
||||
$joinToken,
|
||||
$request,
|
||||
@@ -2282,6 +2346,13 @@ class EventPublicController extends BaseController
|
||||
Response::HTTP_CREATED
|
||||
);
|
||||
|
||||
event(new GuestPhotoUploaded(
|
||||
$eventModel,
|
||||
$photoId,
|
||||
$deviceId,
|
||||
$validated['guest_name'] ?? null,
|
||||
));
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user