checkHadesAccess(); } #[Computed] public function webhooks(): \Illuminate\Pagination\LengthAwarePaginator { return UptelligenceWebhook::query() ->with('vendor') ->withCount(['deliveries', 'deliveries as recent_deliveries_count' => fn ($q) => $q->recent(24)]) ->when($this->vendorId, fn ($q) => $q->where('vendor_id', $this->vendorId)) ->when($this->provider, fn ($q) => $q->where('provider', $this->provider)) ->when($this->status === 'active', fn ($q) => $q->where('is_active', true)) ->when($this->status === 'disabled', fn ($q) => $q->where('is_active', false)) ->latest() ->paginate(15); } #[Computed] public function vendors(): \Illuminate\Database\Eloquent\Collection { return Vendor::orderBy('name')->get(['id', 'name', 'slug']); } #[Computed] public function selectedWebhook(): ?UptelligenceWebhook { if (! $this->selectedWebhookId) { return null; } return UptelligenceWebhook::with('vendor') ->withCount(['deliveries', 'deliveries as recent_deliveries_count' => fn ($q) => $q->recent(24)]) ->find($this->selectedWebhookId); } #[Computed] public function selectedWebhookDeliveries(): \Illuminate\Database\Eloquent\Collection { if (! $this->selectedWebhookId) { return collect(); } return UptelligenceWebhookDelivery::where('webhook_id', $this->selectedWebhookId) ->latest() ->take(20) ->get(); } // ------------------------------------------------------------------------- // Actions // ------------------------------------------------------------------------- public function selectWebhook(int $webhookId): void { $this->selectedWebhookId = $webhookId; $this->showWebhookModal = true; $this->displaySecret = null; unset($this->selectedWebhook, $this->selectedWebhookDeliveries); } public function closeWebhookModal(): void { $this->showWebhookModal = false; $this->selectedWebhookId = null; $this->displaySecret = null; } public function openCreateModal(): void { $this->createVendorId = $this->vendorId; $this->createProvider = UptelligenceWebhook::PROVIDER_GITHUB; $this->showCreateModal = true; } public function closeCreateModal(): void { $this->showCreateModal = false; $this->createVendorId = null; $this->displaySecret = null; } public function createWebhook(): void { $this->validate([ 'createVendorId' => 'required|exists:vendors,id', 'createProvider' => 'required|in:'.implode(',', UptelligenceWebhook::PROVIDERS), ]); // Check if webhook already exists for this vendor/provider $existing = UptelligenceWebhook::where('vendor_id', $this->createVendorId) ->where('provider', $this->createProvider) ->first(); if ($existing) { $this->addError('createVendorId', 'A webhook for this vendor and provider already exists.'); return; } $webhook = UptelligenceWebhook::create([ 'vendor_id' => $this->createVendorId, 'provider' => $this->createProvider, ]); // Show the secret to the user $this->displaySecret = $webhook->secret; $this->showSecretModal = true; $this->showCreateModal = false; // Select the new webhook $this->selectedWebhookId = $webhook->id; unset($this->webhooks); } public function toggleActive(int $webhookId): void { $webhook = UptelligenceWebhook::findOrFail($webhookId); $webhook->update(['is_active' => ! $webhook->is_active]); // Reset failure count when re-enabling if ($webhook->is_active) { $webhook->resetFailureCount(); } unset($this->webhooks, $this->selectedWebhook); } public function regenerateSecret(int $webhookId): void { $webhook = UptelligenceWebhook::findOrFail($webhookId); $this->displaySecret = $webhook->rotateSecret(); $this->showSecretModal = true; unset($this->selectedWebhook); } public function closeSecretModal(): void { $this->showSecretModal = false; $this->displaySecret = null; } public function viewDeliveries(int $webhookId): void { $this->selectedWebhookId = $webhookId; $this->showDeliveriesModal = true; unset($this->selectedWebhookDeliveries); } public function closeDeliveriesModal(): void { $this->showDeliveriesModal = false; } public function retryDelivery(int $deliveryId): void { $delivery = UptelligenceWebhookDelivery::findOrFail($deliveryId); if ($delivery->canRetry()) { $delivery->scheduleRetry(); \Core\Uptelligence\Jobs\ProcessUptelligenceWebhook::dispatch($delivery); } unset($this->selectedWebhookDeliveries); } public function deleteWebhook(int $webhookId): void { $webhook = UptelligenceWebhook::findOrFail($webhookId); $webhook->delete(); $this->closeWebhookModal(); unset($this->webhooks); } public function updatedVendorId(): void { $this->resetPage(); } public function updatedProvider(): void { $this->resetPage(); } public function updatedStatus(): void { $this->resetPage(); } private function checkHadesAccess(): void { if (! auth()->user()?->isHades()) { abort(403, 'Hades access required'); } } public function render(): View { return view('uptelligence::admin.webhook-manager') ->layout('hub::admin.layouts.app', ['title' => 'Webhook Manager']); } }