diff --git a/app/Events/PluginVersionChanged.php b/app/Events/PluginVersionChanged.php deleted file mode 100644 index 4b5f2be0..00000000 --- a/app/Events/PluginVersionChanged.php +++ /dev/null @@ -1,21 +0,0 @@ -plugin = $plugin; - } -} diff --git a/app/Listeners/CopyPluginAssets.php b/app/Listeners/CopyPluginAssets.php index 2ff478ea..a5adae4c 100644 --- a/app/Listeners/CopyPluginAssets.php +++ b/app/Listeners/CopyPluginAssets.php @@ -2,6 +2,7 @@ namespace App\Listeners; +use App\Services\Plugin; use Illuminate\Filesystem\Filesystem; class CopyPluginAssets @@ -18,7 +19,7 @@ class CopyPluginAssets public function handle($event) { - $plugin = $event->plugin; + $plugin = $event instanceof Plugin ? $event : $event->plugin; $dir = public_path('plugins/'.$plugin->name); $this->filesystem->deleteDirectory($dir); diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 145e1ab8..b15a71a4 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -25,7 +25,7 @@ class EventServiceProvider extends ServiceProvider 'App\Listeners\CopyPluginAssets', 'App\Listeners\GeneratePluginTranslations', ], - 'App\Events\PluginVersionChanged' => [ + 'plugin.versionChanged' => [ 'App\Listeners\CopyPluginAssets', 'App\Listeners\GeneratePluginTranslations', ], diff --git a/app/Services/PluginManager.php b/app/Services/PluginManager.php index 3a2aaf25..6d90145d 100644 --- a/app/Services/PluginManager.php +++ b/app/Services/PluginManager.php @@ -82,6 +82,7 @@ class PluginManager return [$item['name'] => ['version' => $item['version']]]; }); $plugins = collect(); + $versionChanged = []; $this->getPluginsDirs() ->flatMap(function ($directory) { @@ -91,7 +92,7 @@ class PluginManager ->filter(function ($directory) { return $this->filesystem->exists($directory.DIRECTORY_SEPARATOR.'package.json'); }) - ->each(function ($directory) use (&$plugins) { + ->each(function ($directory) use (&$plugins, &$versionChanged) { $manifest = json_decode( $this->filesystem->get($directory.DIRECTORY_SEPARATOR.'package.json'), true @@ -117,12 +118,18 @@ class PluginManager $this->enabled->get($name)['version'] )) { $this->enabled->put($name, ['version' => $manifest['version']]); - $this->dispatcher->dispatch(new Events\PluginVersionChanged($plugin)); + $versionChanged[] = $plugin; } } }); $this->plugins = $plugins; + if (count($versionChanged) > 0) { + $this->saveEnabled(); + } + array_walk($versionChanged, function ($plugin) { + $this->dispatcher->dispatch('plugin.versionChanged', [$plugin]); + }); return $plugins; } diff --git a/tests/ListenersTest/CopyPluginAssetsTest.php b/tests/ListenersTest/CopyPluginAssetsTest.php index d0c0393a..082825dc 100644 --- a/tests/ListenersTest/CopyPluginAssetsTest.php +++ b/tests/ListenersTest/CopyPluginAssetsTest.php @@ -23,6 +23,6 @@ class CopyPluginAssetsTest extends TestCase ->once(); }); - event(new \App\Events\PluginVersionChanged($plugin)); + event('plugin.versionChanged', [$plugin]); } } diff --git a/tests/ServicesTest/PluginManagerTest.php b/tests/ServicesTest/PluginManagerTest.php index 5b86bea7..37558aaa 100644 --- a/tests/ServicesTest/PluginManagerTest.php +++ b/tests/ServicesTest/PluginManagerTest.php @@ -117,6 +117,12 @@ class PluginManagerTest extends TestCase $mock->shouldReceive('get') ->with('plugins_enabled', '[]') ->andReturn(json_encode([['name' => 'mayaka', 'version' => '0.0.0']])); + $mock->shouldReceive('set') + ->with( + 'plugins_enabled', + json_encode([['name' => 'mayaka', 'version' => '0.1.0']]) + ) + ->once(); }); $this->mock(Filesystem::class, function ($mock) { $mock->shouldReceive('directories') @@ -149,8 +155,8 @@ class PluginManagerTest extends TestCase app()->forgetInstance(PluginManager::class); resolve(PluginManager::class)->boot(); - Event::assertDispatched(\App\Events\PluginVersionChanged::class, function ($event) { - $this->assertEquals('0.1.0', $event->plugin->version); + Event::assertDispatched('plugin.versionChanged', function ($eventName, $payload) { + $this->assertEquals('0.1.0', $payload[0]->version); return true; });