From 5d27647b9cbf41b928c87767ab3fa87eb69e3204 Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Mon, 15 Jul 2024 10:26:51 -0400 Subject: [PATCH 1/8] Add `SiteCreated` event. --- src/Events/SiteCreated.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/Events/SiteCreated.php diff --git a/src/Events/SiteCreated.php b/src/Events/SiteCreated.php new file mode 100644 index 00000000000..19e76434dba --- /dev/null +++ b/src/Events/SiteCreated.php @@ -0,0 +1,13 @@ + Date: Mon, 15 Jul 2024 10:56:56 -0400 Subject: [PATCH 2/8] Extract `hydrateConfig()` helper method for reuse. --- src/Sites/Sites.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Sites/Sites.php b/src/Sites/Sites.php index 7a665bda205..6ffa4c5e5ae 100644 --- a/src/Sites/Sites.php +++ b/src/Sites/Sites.php @@ -3,6 +3,7 @@ namespace Statamic\Sites; use Closure; +use Illuminate\Support\Collection; use Statamic\Facades\Blueprint; use Statamic\Facades\File; use Statamic\Facades\User; @@ -100,7 +101,7 @@ public function setSites($sites = null): self { $sites ??= $this->getSavedSites(); - $this->sites = collect($sites)->map(fn ($site, $handle) => new Site($handle, $site)); + $this->sites = $this->hydrateConfig($sites); return $this; } @@ -242,6 +243,11 @@ public function config(): array ->all(); } + protected function hydrateConfig($config): Collection + { + return collect($config)->map(fn ($site, $handle) => new Site($handle, $site)); + } + /** * Deprecated! This is being replaced by `setSites()` and `setSiteValue()`. * From d78f14509f85a92b8db5f9a9dc458fa1cb1a9775 Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Mon, 15 Jul 2024 10:57:25 -0400 Subject: [PATCH 3/8] Dispatch `SiteCreated` events. --- src/Sites/Sites.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Sites/Sites.php b/src/Sites/Sites.php index 6ffa4c5e5ae..a8384771cd6 100644 --- a/src/Sites/Sites.php +++ b/src/Sites/Sites.php @@ -4,6 +4,7 @@ use Closure; use Illuminate\Support\Collection; +use Statamic\Events\SiteCreated; use Statamic\Facades\Blueprint; use Statamic\Facades\File; use Statamic\Facades\User; @@ -139,7 +140,11 @@ protected function getSavedSites() public function save() { + $newSites = $this->getNewSites(); + File::put($this->path(), YAML::dump($this->config())); + + $newSites->each(fn ($site) => SiteCreated::dispatch($site)); } public function blueprint() @@ -248,6 +253,16 @@ protected function hydrateConfig($config): Collection return collect($config)->map(fn ($site, $handle) => new Site($handle, $site)); } + protected function getNewSites(): Collection + { + $currentSites = $this->getSavedSites(); + $newSites = $this->config(); + + return $this->hydrateConfig( + collect($newSites)->diffKeys($currentSites) + ); + } + /** * Deprecated! This is being replaced by `setSites()` and `setSiteValue()`. * From 337d51f0c04fdf9eb983c3244cf154c2bb9e9907 Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Mon, 15 Jul 2024 10:59:48 -0400 Subject: [PATCH 4/8] Add `SiteDeleted` event. --- src/Events/SiteDeleted.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/Events/SiteDeleted.php diff --git a/src/Events/SiteDeleted.php b/src/Events/SiteDeleted.php new file mode 100644 index 00000000000..fcffdff6a52 --- /dev/null +++ b/src/Events/SiteDeleted.php @@ -0,0 +1,13 @@ + Date: Mon, 15 Jul 2024 11:00:59 -0400 Subject: [PATCH 5/8] Dispatch `SiteDeleted` events. --- src/Sites/Sites.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Sites/Sites.php b/src/Sites/Sites.php index a8384771cd6..52a04ee4a6b 100644 --- a/src/Sites/Sites.php +++ b/src/Sites/Sites.php @@ -5,6 +5,7 @@ use Closure; use Illuminate\Support\Collection; use Statamic\Events\SiteCreated; +use Statamic\Events\SiteDeleted; use Statamic\Facades\Blueprint; use Statamic\Facades\File; use Statamic\Facades\User; @@ -141,10 +142,12 @@ protected function getSavedSites() public function save() { $newSites = $this->getNewSites(); + $deletedSites = $this->getDeletedSites(); File::put($this->path(), YAML::dump($this->config())); $newSites->each(fn ($site) => SiteCreated::dispatch($site)); + $deletedSites->each(fn ($site) => SiteDeleted::dispatch($site)); } public function blueprint() @@ -263,6 +266,16 @@ protected function getNewSites(): Collection ); } + protected function getDeletedSites(): Collection + { + $currentSites = $this->getSavedSites(); + $newSites = $this->config(); + + return $this->hydrateConfig( + collect($currentSites)->diffKeys($newSites) + ); + } + /** * Deprecated! This is being replaced by `setSites()` and `setSiteValue()`. * From 82e37787785ed7f5cf7bf058a88d5b07e98259d3 Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Mon, 15 Jul 2024 13:13:36 -0400 Subject: [PATCH 6/8] Add `SiteSaved` event. --- src/Events/SiteSaved.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/Events/SiteSaved.php diff --git a/src/Events/SiteSaved.php b/src/Events/SiteSaved.php new file mode 100644 index 00000000000..1148dc91c3c --- /dev/null +++ b/src/Events/SiteSaved.php @@ -0,0 +1,13 @@ + Date: Mon, 15 Jul 2024 13:25:38 -0400 Subject: [PATCH 7/8] Dispatch `SiteSaved` events. --- src/Sites/Sites.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Sites/Sites.php b/src/Sites/Sites.php index 52a04ee4a6b..96cb35aee9f 100644 --- a/src/Sites/Sites.php +++ b/src/Sites/Sites.php @@ -6,6 +6,7 @@ use Illuminate\Support\Collection; use Statamic\Events\SiteCreated; use Statamic\Events\SiteDeleted; +use Statamic\Events\SiteSaved; use Statamic\Facades\Blueprint; use Statamic\Facades\File; use Statamic\Facades\User; @@ -141,13 +142,19 @@ protected function getSavedSites() public function save() { + // Track for `SiteCreated` and `SiteDeleted` events, before saving to file $newSites = $this->getNewSites(); $deletedSites = $this->getDeletedSites(); + // Save to file File::put($this->path(), YAML::dump($this->config())); + // Dispatch our tracked `SiteCreated` and `SiteDeleted` events $newSites->each(fn ($site) => SiteCreated::dispatch($site)); $deletedSites->each(fn ($site) => SiteDeleted::dispatch($site)); + + // Dispatch `SiteSaved` events + $this->sites->each(fn ($site) => SiteSaved::dispatch($site)); } public function blueprint() From 7b96cc34db3750258d4865981956751d0f4c70f8 Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Mon, 15 Jul 2024 13:46:12 -0400 Subject: [PATCH 8/8] Tests. --- tests/Sites/SitesConfigTest.php | 75 +++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tests/Sites/SitesConfigTest.php b/tests/Sites/SitesConfigTest.php index 145823ca511..dfa0d4ac134 100644 --- a/tests/Sites/SitesConfigTest.php +++ b/tests/Sites/SitesConfigTest.php @@ -2,8 +2,12 @@ namespace Tests\Sites; +use Illuminate\Support\Facades\Event; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; +use Statamic\Events\SiteCreated; +use Statamic\Events\SiteDeleted; +use Statamic\Events\SiteSaved; use Statamic\Facades\Config; use Statamic\Facades\File; use Statamic\Facades\Site; @@ -436,4 +440,75 @@ public function it_validates_at_least_one_site_is_required_for_multiple_sites_th 'sites' => ['This field is required.'], ]]); } + + #[Test] + public function it_dispatches_site_saved_events() + { + Event::fake(); + + Site::save(); + + Event::assertDispatched(SiteSaved::class, 2); + + Event::assertDispatched(function (SiteSaved $event) { + return $event->site->handle() === 'english'; + }); + + Event::assertDispatched(function (SiteSaved $event) { + return $event->site->handle() === 'french'; + }); + } + + #[Test] + public function it_dispatches_site_created_events() + { + Event::fake(); + + Site::setSites( + collect(Site::config()) + ->put('german', ['name' => 'German', 'url' => '/de/']) + ->put('polish', ['name' => 'Polish', 'url' => '/pl/']) + ->all() + )->save(); + + Event::assertDispatched(SiteCreated::class, 2); + + Event::assertDispatched(function (SiteCreated $event) { + return $event->site->handle() === 'german'; + }); + + Event::assertDispatched(function (SiteCreated $event) { + return $event->site->handle() === 'polish'; + }); + + // We're saving a total of 4 sites to yaml after the above changes, so we should see 4 `SiteSaved` events as well + Event::assertDispatched(SiteSaved::class, 4); + } + + #[Test] + public function it_dispatches_site_deleted_events() + { + Event::fake(); + + Site::setSites( + collect(Site::config()) + ->put('german', ['name' => 'German', 'url' => '/de/']) + ->forget('english') + ->forget('french') + ->all() + )->save(); + + Event::assertDispatched(SiteDeleted::class, 2); + + Event::assertDispatched(function (SiteDeleted $event) { + return $event->site->handle() === 'english'; + }); + + Event::assertDispatched(function (SiteDeleted $event) { + return $event->site->handle() === 'french'; + }); + + // We're saving a total of 1 site to yaml after the above changes, so we should see 1 `SiteSaved` event as well + Event::assertDispatched(SiteSaved::class, 1); + } }