diff --git a/server/src/Http/Middleware/SetStorefrontSession.php b/server/src/Http/Middleware/SetStorefrontSession.php index 0f56bfb0..9cac2455 100644 --- a/server/src/Http/Middleware/SetStorefrontSession.php +++ b/server/src/Http/Middleware/SetStorefrontSession.php @@ -24,6 +24,7 @@ public function handle(Request $request, \Closure $next) if ($this->isValidKey($key)) { $this->setKey($key); + $this->relateApiRequestLog($request); $this->setupCustomerSession($request); return $next($request); @@ -92,6 +93,25 @@ public function setKey(string $key): void session($session); } + /** + * Relates the request's API log to the store or network whose key made it. + * + * Core's LogApiRequest adds the ids in this request attribute (its + * RELATED_ATTRIBUTE constant) to the log's related column. The name is + * spelled out so an older core without the constant ignores it. + */ + public function relateApiRequestLog(Request $request): void + { + $publicId = session('storefront_store_public_id') ?? session('storefront_network_public_id'); + + if ($publicId) { + $related = (array) $request->attributes->get('api_request_log_related', []); + $related[] = $publicId; + + $request->attributes->set('api_request_log_related', $related); + } + } + /** * Set the customer id to session if applicable. * diff --git a/server/tests/Unit/Http/Middleware/SetStorefrontSessionTest.php b/server/tests/Unit/Http/Middleware/SetStorefrontSessionTest.php index 70740282..4f8b66ff 100644 --- a/server/tests/Unit/Http/Middleware/SetStorefrontSessionTest.php +++ b/server/tests/Unit/Http/Middleware/SetStorefrontSessionTest.php @@ -47,12 +47,11 @@ expect($middleware->isValidKey('store_secret'))->toBeTrue(); - $response = $middleware->handle( - Request::create('/storefront', 'GET', [], [], [], ['HTTP_AUTHORIZATION' => 'Bearer store_secret']), - fn () => response()->json(['ok' => true]) - ); + $request = Request::create('/storefront', 'GET', [], [], [], ['HTTP_AUTHORIZATION' => 'Bearer store_secret']); + $response = $middleware->handle($request, fn () => response()->json(['ok' => true])); expect($response->getData(true))->toBe(['ok' => true]) + ->and($request->attributes->get('api_request_log_related'))->toBe(['store_public']) ->and(session('storefront_key'))->toBe('store_secret') ->and(session('storefront_store'))->toBe('store_uuid') ->and(session('storefront_store_public_id'))->toBe('store_public') @@ -87,10 +86,27 @@ $middleware->setKey('network_secret'); + $request = Request::create('/storefront/v1/customers/request-creation-code', 'POST'); + $request->attributes->set('api_request_log_related', ['order_public']); + $middleware->relateApiRequestLog($request); + expect(session('storefront_network'))->toBe('network_uuid') ->and(session('storefront_network_public_id'))->toBe('network_public') ->and(session('storefront_currency'))->toBe('MNT') - ->and(session('api_credential'))->toBe('network_secret'); + ->and(session('api_credential'))->toBe('network_secret') + ->and($request->attributes->get('api_request_log_related'))->toBe(['order_public', 'network_public']); +}); + +test('storefront session middleware relates no api request log id without a resolved store or network', function () { + session([ + 'storefront_store_public_id' => null, + 'storefront_network_public_id' => null, + ]); + + $request = Request::create('/storefront/v1/customers/request-creation-code', 'POST'); + (new SetStorefrontSession())->relateApiRequestLog($request); + + expect($request->attributes->has('api_request_log_related'))->toBeFalse(); }); test('switching between a network and a store key never leaves both scopes in the session', function () {