SendsDiditRequests.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace App\Services\Didit\Concerns;
  3. use App\Data\Didit\DiditData;
  4. use Illuminate\Http\Client\PendingRequest;
  5. use Illuminate\Support\Facades\Http;
  6. use Illuminate\Support\Facades\Log;
  7. use Throwable;
  8. trait SendsDiditRequests
  9. {
  10. protected function diditRequest(
  11. string $method,
  12. string $path,
  13. string $errorMessage,
  14. array|DiditData|null $payload = null,
  15. ): array {
  16. $payload = $payload instanceof DiditData ? $payload->toArray() : $payload;
  17. $endpoint = $this->diditUrl($path);
  18. try {
  19. $options = $payload === null ? [] : ['json' => $payload];
  20. $response = $this->diditHttp()
  21. ->send($method, $endpoint, $options)
  22. ->throw();
  23. $result = $response->json() ?? [];
  24. if (app()->environment('local', 'development')) {
  25. Log::channel('didit')->info('Requisicao ao Didit concluida com sucesso', [
  26. 'method' => strtoupper($method),
  27. 'endpoint' => $endpoint,
  28. 'payload' => $this->maskDiditPayload($payload ?? []),
  29. 'result' => $this->maskDiditPayload($result),
  30. ]);
  31. }
  32. return $result;
  33. } catch (Throwable $e) {
  34. $responseBody = null;
  35. if (method_exists($e, 'getResponse')) {
  36. $responseBody = $e->getResponse()?->json();
  37. } elseif (isset($e->response)) {
  38. $responseBody = $e->response->json();
  39. }
  40. Log::channel('didit')->error('Falha na requisicao ao Didit', [
  41. 'method' => strtoupper($method),
  42. 'endpoint' => $endpoint,
  43. 'payload' => $this->maskDiditPayload($payload ?? []),
  44. 'exception' => $e->getMessage(),
  45. 'result' => $responseBody,
  46. ]);
  47. $message = $errorMessage;
  48. $detail = data_get($responseBody, 'detail') ?? data_get($responseBody, 'message');
  49. if (is_string($detail) && $detail !== '') {
  50. $message .= ': '.$detail;
  51. }
  52. throw new \RuntimeException($message, previous: $e);
  53. }
  54. }
  55. protected function diditHttp(): PendingRequest
  56. {
  57. return Http::withHeaders([
  58. 'x-api-key' => (string) config('services.didit.api_key'),
  59. 'Content-Type' => 'application/json',
  60. ])
  61. ->connectTimeout((int) config('services.didit.connect_timeout', 5))
  62. ->timeout((int) config('services.didit.timeout', 15))
  63. ->acceptJson();
  64. }
  65. protected function diditUrl(string $path): string
  66. {
  67. return rtrim((string) config('services.didit.base_url'), '/').'/'.ltrim($path, '/');
  68. }
  69. protected function maskDiditPayload(array $data): array
  70. {
  71. $sensitive = [
  72. 'identification_number', 'personal_number', 'document_number', 'tax_number',
  73. 'date_of_birth', 'first_name', 'last_name', 'full_name', 'email', 'phone',
  74. ];
  75. array_walk_recursive($data, function (&$value, $key) use ($sensitive) {
  76. if (in_array($key, $sensitive, true) && is_scalar($value)) {
  77. $value = '***';
  78. return;
  79. }
  80. if (is_string($value) && str_starts_with($value, 'http')) {
  81. $value = explode('?', $value)[0];
  82. }
  83. });
  84. return $data;
  85. }
  86. }