, * title: string, * message: list * }> */ public function claimFor(User $user, Tenant $tenant): array { return DB::transaction(function () use ($user, $tenant): array { $lockedUser = User::query()->whereKey($user->getKey())->lockForUpdate()->firstOrFail(); $changes = EventDateChange::query() ->where('tenant_code', $tenant->codigo) ->whereDoesntHave('views', fn ($query) => $query ->where('user_id', $lockedUser->getKey()) ->where('display_count', '>=', self::MAX_DISPLAYS)) ->orderBy('created_at') ->orderBy('id') ->get(); $notices = $this->formatter->format($changes); $claimedChangeIds = collect($notices)->pluck('change_ids')->flatten()->unique(); foreach ($claimedChangeIds as $changeId) { $view = EventDateChangeView::query()->firstOrNew([ 'user_id' => $lockedUser->getKey(), 'event_date_change_id' => $changeId, ]); $view->display_count = min( self::MAX_DISPLAYS, ((int) $view->display_count) + 1, ); $view->last_displayed_at = now(); $view->save(); } return $notices; }); } }