Files
fotospiel-app/app/Services/Integrations/IntegrationWebhookRecorder.php
Codex Agent fc3e6715db
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled
Add integrations health monitoring
2026-01-02 18:35:12 +01:00

83 lines
2.3 KiB
PHP

<?php
namespace App\Services\Integrations;
use App\Models\IntegrationWebhookEvent;
use Illuminate\Support\Str;
class IntegrationWebhookRecorder
{
/**
* @param array<string, mixed> $context
*/
public function recordReceived(string $provider, ?string $eventId, ?string $eventType, array $context = []): IntegrationWebhookEvent
{
return IntegrationWebhookEvent::create([
'provider' => $provider,
'event_id' => $eventId,
'event_type' => $eventType,
'status' => IntegrationWebhookEvent::STATUS_RECEIVED,
'received_at' => now(),
'context' => $context,
]);
}
/**
* @param array<string, mixed> $context
*/
public function markProcessed(IntegrationWebhookEvent $event, array $context = []): IntegrationWebhookEvent
{
$event->forceFill([
'status' => IntegrationWebhookEvent::STATUS_PROCESSED,
'processed_at' => now(),
'context' => $this->mergeContext($event, $context),
])->save();
return $event;
}
/**
* @param array<string, mixed> $context
*/
public function markIgnored(IntegrationWebhookEvent $event, array $context = []): IntegrationWebhookEvent
{
$event->forceFill([
'status' => IntegrationWebhookEvent::STATUS_IGNORED,
'processed_at' => now(),
'context' => $this->mergeContext($event, $context),
])->save();
return $event;
}
/**
* @param array<string, mixed> $context
*/
public function markFailed(IntegrationWebhookEvent $event, string $message, array $context = []): IntegrationWebhookEvent
{
$event->forceFill([
'status' => IntegrationWebhookEvent::STATUS_FAILED,
'failed_at' => now(),
'error_message' => Str::limit($message, 500, ''),
'context' => $this->mergeContext($event, $context),
])->save();
return $event;
}
/**
* @param array<string, mixed> $context
* @return array<string, mixed>
*/
private function mergeContext(IntegrationWebhookEvent $event, array $context): array
{
$existing = $event->context ?? [];
if (! is_array($existing)) {
$existing = [];
}
return array_merge($existing, $context);
}
}