Skip to content

Commit bbcf79b

Browse files
author
Quentin Schmick
authored
feature/expand-response-storage (#15)
* Added unique message when internal rate limit vs external rate limit; Added storing of response and code * Added observer to ensure body is json not string
1 parent 8c29a1f commit bbcf79b

File tree

4 files changed

+34
-3
lines changed

4 files changed

+34
-3
lines changed

src/Message/RateLimitExceededException.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,16 @@ final class RateLimitExceededException extends ShipEngineException
2525
* @param DateInterval $retryAfter
2626
* @param string|null $source
2727
* @param string|null $requestId
28+
* @param string $message
2829
*/
2930
public function __construct(
3031
DateInterval $retryAfter,
3132
string|null $source = null,
32-
string|null $requestId = null
33+
string|null $requestId = null,
34+
string $message = 'You have exceeded the rate limit.',
3335
) {
3436
parent::__construct(
35-
'You have exceeded the rate limit.',
37+
$message,
3638
$requestId,
3739
$source,
3840
'System',

src/Models/RequestLog.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace BluefynInternational\ShipEngine\Models;
44

55
use AlwaysOpen\RequestLogger\Models\RequestLogBaseModel;
6+
use BluefynInternational\ShipEngine\Observers\RequestLogObserver;
67

78
/**
89
* BluefynInternational\ShipEngine\Models\RequestLog
@@ -18,6 +19,12 @@
1819
*/
1920
class RequestLog extends RequestLogBaseModel
2021
{
22+
protected static function boot()
23+
{
24+
parent::boot();
25+
parent::observe(RequestLogObserver::class);
26+
}
27+
2128
public function getTable()
2229
{
2330
return config('shipengine.request_log_table_name');
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace BluefynInternational\ShipEngine\Observers;
4+
5+
use AlwaysOpen\RequestLogger\Models\RequestLogBaseModel;
6+
7+
class RequestLogObserver
8+
{
9+
public function saving(RequestLogBaseModel $model)
10+
{
11+
if (is_string($model->body)) {
12+
try {
13+
$model->body = json_decode($model->body, true);
14+
} catch (\Exception $e) {
15+
// no op
16+
}
17+
}
18+
}
19+
}

src/ShipEngineClient.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ private static function sendRequest(
186186
}
187187

188188
try {
189+
$response = null;
189190
self::incrementRequestCount($config);
190191

191192
$response = $client->send(
@@ -200,6 +201,8 @@ private static function sendRequest(
200201
}
201202
} catch (Exception|Throwable $err) {
202203
if (config('shipengine.track_requests')) {
204+
$requestLog->response_code = $response?->getStatusCode();
205+
$requestLog->response = $requestLogResponse ?? null;
203206
$requestLog->exception = substr($err->getMessage(), 0, config('shipengine.request_log_table_exception_length'));
204207
$requestLog->save();
205208
}
@@ -294,7 +297,7 @@ private static function incrementRequestCount(ShipEngineConfig $config) : void
294297
$nextExpire = now()->seconds(0)->addMinute();
295298

296299
if ($count > $config->requestLimitPerMinute) {
297-
throw new RateLimitExceededException(retryAfter: new DateInterval('PT1S'));
300+
throw new RateLimitExceededException(retryAfter: new DateInterval('PT1S'), message: 'Internal conifg API rate limit exceeded.');
298301
}
299302

300303
Cache::put('shipengine.api-request.count', $count + 1, $nextExpire);

0 commit comments

Comments
 (0)