diff --git a/framework/core/js/src/common/Application.js b/framework/core/js/src/common/Application.js index cfaac22aa..c886a423a 100644 --- a/framework/core/js/src/common/Application.js +++ b/framework/core/js/src/common/Application.js @@ -159,6 +159,8 @@ export default class Application { title = ''; titleCount = 0; + initialRoute; + load(payload) { this.data = payload; this.translator.locale = payload.locale; @@ -174,6 +176,8 @@ export default class Application { this.session = new Session(this.store.getById('users', this.data.session.userId), this.data.session.csrfToken); this.mount(); + + this.initialRoute = window.location.href; } bootExtensions(extensions) { @@ -226,7 +230,8 @@ export default class Application { * @public */ preloadedApiDocument() { - if (this.data.apiDocument) { + // If the URL has changed, the preloaded Api document is invalid. + if (this.data.apiDocument && window.location.href === this.initialRoute) { const results = this.store.pushPayload(this.data.apiDocument); this.data.apiDocument = null; diff --git a/framework/core/src/Forum/ForumServiceProvider.php b/framework/core/src/Forum/ForumServiceProvider.php index 2d1915dd3..8e671dbfc 100644 --- a/framework/core/src/Forum/ForumServiceProvider.php +++ b/framework/core/src/Forum/ForumServiceProvider.php @@ -204,7 +204,7 @@ class ForumServiceProvider extends AbstractServiceProvider $factory = $this->container->make(RouteHandlerFactory::class); $defaultRoute = $this->container->make('flarum.settings')->get('default_route'); - if (isset($routes->getRoutes()['GET'][$defaultRoute]['handler'])) { + if (isset($routes->getRouteData()[0]['GET'][$defaultRoute]['handler'])) { $toDefaultController = $routes->getRoutes()['GET'][$defaultRoute]['handler']; } else { $toDefaultController = $factory->toForum(Content\Index::class); diff --git a/framework/core/tests/integration/forum/DefaultRouteTest.php b/framework/core/tests/integration/forum/DefaultRouteTest.php new file mode 100644 index 000000000..892cc7498 --- /dev/null +++ b/framework/core/tests/integration/forum/DefaultRouteTest.php @@ -0,0 +1,99 @@ +prepareDatabase([ + 'discussions' => [ + ['id' => 1, 'title' => 'foo bar', 'created_at' => Carbon::createFromDate(1975, 5, 21)->toDateTimeString(), 'last_posted_at' => Carbon::createFromDate(1975, 5, 21)->toDateTimeString(), 'user_id' => 1, 'first_post_id' => 1, 'comment_count' => 1], + ], + 'posts' => [ + ['id' => 1, 'discussion_id' => 1, 'created_at' => Carbon::createFromDate(1975, 5, 21)->toDateTimeString(), 'user_id' => 1, 'type' => 'comment', 'content' => '

foo bar

'] + ] + ]); + } + + /** + * This is necessary as we need to add the setting to the DB before the app boots. + */ + protected function setDefaultRoute($defaultRoute) + { + OverrideDefaultRouteServiceProvider::$defaultRoute = $defaultRoute; + $this->extend( + (new Extend\ServiceProvider())->register(OverrideDefaultRouteServiceProvider::class) + ); + } + + /** + * @test + */ + public function default_route_payload_includes_discussions() + { + $response = $this->send( + $this->request('GET', '/') + ); + + $this->assertStringContainsString('apiDocument', $response->getBody()); + } + + /** + * @test + */ + public function nonexistent_custom_homepage_uses_default_payload() + { + $this->setDefaultRoute('/nonexistent'); + + $response = $this->send( + $this->request('GET', '/') + ); + + $this->assertStringContainsString('apiDocument', $response->getBody()); + } + + /** + * @test + */ + public function existent_custom_homepage_doesnt_use_default_payload() + { + $this->setDefaultRoute('/settings'); + + $response = $this->send( + $this->request('GET', '/') + ); + + $this->assertStringNotContainsString('apiDocument', $response->getBody()); + } +} + +class OverrideDefaultRouteServiceProvider extends AbstractServiceProvider +{ + public static $defaultRoute; + + public function register() + { + $settings = $this->container->make(SettingsRepositoryInterface::class); + + $settings->set('default_route', static::$defaultRoute); + } +}