TenantAtlas/app/Services/Graph/GraphLogger.php

90 lines
3.0 KiB
PHP

<?php
namespace App\Services\Graph;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
class GraphLogger
{
public function logRequest(string $action, array $context = []): void
{
$payload = [
'action' => $action,
'method' => $context['method'] ?? null,
'endpoint' => $context['endpoint'] ?? null,
'full_path' => $context['full_path'] ?? null,
'query' => $context['query'] ?? null,
'tenant' => $context['tenant'] ?? null,
'client_request_id' => $context['client_request_id'] ?? null,
];
Log::info('graph.request', $this->filter($payload));
}
public function logResponse(string $action, GraphResponse $response, array $context = []): void
{
$payload = [
'action' => $action,
'status' => $response->status,
'success' => $response->success,
'warnings' => $response->warnings,
'method' => $context['method'] ?? $response->meta['method'] ?? null,
'endpoint' => $context['endpoint'] ?? $response->meta['path'] ?? null,
'full_path' => $context['full_path'] ?? $response->meta['full_path'] ?? null,
'tenant' => $context['tenant'] ?? $response->meta['tenant'] ?? null,
'request_id' => $response->meta['request_id'] ?? null,
'client_request_id' => $response->meta['client_request_id'] ?? null,
];
if ($response->failed()) {
$payload['error_code'] = $response->meta['error_code'] ?? $this->firstErrorField($response->errors, 'code');
$payload['error_message'] = $response->meta['error_message'] ?? $this->firstErrorMessage($response->errors, $response->data);
$payload['response_excerpt'] = $response->meta['body_excerpt'] ?? null;
}
Log::info('graph.response', $this->filter($payload));
}
private function firstErrorField(array $errors, string $key): ?string
{
foreach ($errors as $error) {
if (is_array($error) && is_string($error[$key] ?? null)) {
return $error[$key];
}
}
return null;
}
private function firstErrorMessage(array $errors, array $data): ?string
{
$message = $data['error']['message'] ?? null;
if (is_string($message) && $message !== '') {
return $message;
}
foreach ($errors as $error) {
if (is_array($error) && is_string($error['message'] ?? null)) {
return $error['message'];
}
if (is_array($error) && is_string($error['error']['message'] ?? null)) {
return $error['error']['message'];
}
if (is_string($error) && $error !== '') {
return Str::limit($error, 500);
}
}
return null;
}
private function filter(array $payload): array
{
return array_filter($payload, static fn ($value) => $value !== null && $value !== []);
}
}