option('dry-run'); if (! $dryRun && ! $client->isConfigured()) { $this->warn('Search Console nicht konfiguriert (GSC_ENABLED, GSC_SERVICE_ACCOUNT_FILE) — nichts zu tun.'); return self::SUCCESS; } $budget = max(1, (int) ($this->option('budget') ?: config('search_console.daily_budget', 300))); $portals = $checker->portals(); if ($this->option('portal')) { $wanted = Portal::tryFrom((string) $this->option('portal')); $portals = array_values(array_filter($portals, fn (Portal $portal): bool => $portal === $wanted)); } if ($portals === []) { $this->warn('Kein Portal mit eingetragener Property.'); return self::SUCCESS; } $checked = 0; $failed = 0; foreach ($portals as $portal) { $candidates = $checker->candidates($portal, $budget); $this->info(sprintf('%s: %d fällige Meldungen (Kontingent %d).', $portal->label(), $candidates->count(), $budget)); foreach ($candidates as $release) { if ($dryRun) { $this->line(sprintf(' [%d] %s (veröffentlicht %s)', $release->id, $release->slug, $release->published_at?->format('d.m.Y') ?? '-')); continue; } try { $check = $checker->check($release, $portal); $checked++; $this->line(sprintf(' [%d] %s → %s', $release->id, $release->slug, $check->state->label())); } catch (\Throwable $e) { $failed++; report($e); $this->error(sprintf(' [%d] %s: %s', $release->id, $release->slug, $e->getMessage())); // Quote oder Auth kaputt: der Rest des Laufs würde nur // weitere Fehler produzieren. if ($failed >= 5 && $checked === 0) { $this->error('Abbruch nach fünf Fehlern ohne Treffer.'); return self::FAILURE; } } } } if (! $dryRun) { $this->info(sprintf('%d Prüfungen gespeichert, %d fehlgeschlagen.', $checked, $failed)); } return self::SUCCESS; } }