Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions server/src/Http/Middleware/SetStorefrontSession.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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.
*
Expand Down
26 changes: 21 additions & 5 deletions server/tests/Unit/Http/Middleware/SetStorefrontSessionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down Expand Up @@ -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 () {
Expand Down