Skip to content
Open
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
12 changes: 6 additions & 6 deletions routes/routes.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?php

use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Route;
use Statamic\API\Middleware\Cache;
use Statamic\API\Middleware\HandleAuthentication;
Expand All @@ -11,13 +12,12 @@
Route::middleware([
RequireStatamicPro::class,
HandleAuthentication::class,
...Arr::wrap(config('statamic.api.middleware')),
Cache::class,
])->group(function () {
Route::middleware(config('statamic.api.middleware'))
->name('statamic.api.')
->prefix(config('statamic.api.route'))
->group(__DIR__.'/api.php');
});
])
->name('statamic.api.')
->prefix(config('statamic.api.route'))
->group(__DIR__.'/api.php');
}

if (config('statamic.cp.enabled')) {
Expand Down
5 changes: 3 additions & 2 deletions src/GraphQL/DefaultSchema.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,10 @@ private function getQueries()
private function getMiddleware()
{
return array_merge(
[HandleAuthentication::class, CacheResponse::class],
[HandleAuthentication::class],
config('statamic.graphql.middleware', []),
GraphQL::getExtraMiddleware()
GraphQL::getExtraMiddleware(),
[CacheResponse::class],
);
}

Expand Down
2 changes: 1 addition & 1 deletion tests/API/APITest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1143,7 +1143,7 @@ class FakeTokenHandler
{
public function handle(\Statamic\Contracts\Tokens\Token $token, \Illuminate\Http\Request $request, \Closure $next)
{
return $next($token);
return $next($request);
}
}

Expand Down
76 changes: 76 additions & 0 deletions tests/API/CustomMiddlewareTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?php

namespace Tests\API;

use Facades\Tests\Factories\EntryFactory;
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Routing\Middleware\SubstituteBindings;
use PHPUnit\Framework\Attributes\Test;
use Statamic\Facades;
use Tests\PreventSavingStacheItemsToDisk;
use Tests\TestCase;

class CustomMiddlewareTest extends TestCase
{
use PreventSavingStacheItemsToDisk;

protected function getEnvironmentSetUp($app)
{
parent::getEnvironmentSetUp($app);

$app[Kernel::class]->setMiddlewareGroups(array_merge(
$app[Kernel::class]->getMiddlewareGroups(),
['secure-api' => [RequireApiKeyHeader::class, SubstituteBindings::class]],
));

$app['config']->set('statamic.api.middleware', 'secure-api');
}

public function setUp(): void
{
parent::setUp();

Facades\Config::set('statamic.api.resources.collections', true);

$collection = Facades\Collection::make('articles')->save();

EntryFactory::id('apple')->slug('apple')->collection($collection)->create();
}

#[Test]
public function custom_middleware_is_applied()
{
$this
->getJson('/api/collections/articles/entries')
->assertUnauthorized();

$this
->getJson('/api/collections/articles/entries', ['X-Api-Key' => 'secret'])
->assertOk()
->assertJsonPath('data.0.id', 'apple');
}

#[Test]
public function custom_middleware_runs_before_the_cached_response_is_returned()
{
$this
->getJson('/api/collections/articles/entries', ['X-Api-Key' => 'secret'])
->assertOk();

$this
->getJson('/api/collections/articles/entries')
->assertUnauthorized();
}
}

class RequireApiKeyHeader
{
public function handle($request, $next)
{
if ($request->header('X-Api-Key') !== 'secret') {
abort(401);
}

return $next($request);
}
}
12 changes: 11 additions & 1 deletion tests/Feature/GraphQL/CustomMiddlewareTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ protected function addCustomMiddlewareWithMethod($app)
}

#[Test]
#[DefineEnvironment('addCustomMiddlewareWithMethod')]
#[DefineEnvironment('addCustomMiddlewareThroughConfig')]
public function a_custom_middleware_can_be_added_to_the_default_schema_through_config()
{
$this->post('/graphql', ['query' => '{ping}']);
Expand All @@ -53,6 +53,16 @@ protected function addCustomMiddlewareThroughConfig($app)
{
$app['config']->set('statamic.graphql.middleware', [CountRequests::class]);
}

#[Test]
#[DefineEnvironment('addCustomMiddlewareThroughConfig')]
public function custom_middleware_runs_before_the_cached_response_is_returned()
{
$this->post('/graphql', ['query' => '{ping}']);
$this->post('/graphql', ['query' => '{ping}']);

$this->assertEquals(2, app('request-count'));
}
}

class CountRequests
Expand Down
19 changes: 5 additions & 14 deletions tests/Feature/GraphQL/RequestCacheTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ public function getEnvironmentSetup($app)

GraphQL::addQuery(QueryOne::class);
GraphQL::addQuery(QueryTwo::class);
GraphQL::addMiddleware(TrackRequests::class);
}

#[Test]
Expand Down Expand Up @@ -254,6 +253,11 @@ class QueryOne extends PingQuery

public function resolve()
{
app('request-tracking')[] = [
'query' => request()->input('query'),
'variables' => request()->input('variables'),
];

return 'one';
}
}
Expand All @@ -268,19 +272,6 @@ public function resolve()
}
}

class TrackRequests
{
public function handle($request, $next)
{
app('request-tracking')[] = [
'query' => $request->input('query'),
'variables' => $request->input('variables'),
];

return $next($request);
}
}

class TestTokenHandler
{
public function handle($token, $request, $next)
Expand Down
Loading