From f9b32c8e69d7b42217c8008fe4053ea9335a8132 Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Mon, 9 Dec 2019 23:30:49 +0800 Subject: [PATCH] Check dependencies and conflicts before installing plugin fixes #109 --- app/Http/Controllers/MarketController.php | 9 +++++ app/Http/Controllers/PluginController.php | 22 +------------ app/Services/PluginManager.php | 30 +++++++++++++++++ .../mixins/alertUnresolvedPlugins.ts | 19 +++++++++++ .../src/components/mixins/enablePlugin.ts | 17 ++-------- resources/assets/src/views/admin/Market.vue | 9 ++++- .../assets/tests/views/admin/Market.test.ts | 10 ++++++ resources/lang/en/admin.yml | 1 + resources/lang/es_ES/admin.yml | 1 + resources/lang/zh_CN/admin.yml | 1 + resources/misc/changelogs/en/5.0.0.md | 1 + resources/misc/changelogs/zh_CN/5.0.0.md | 1 + .../ControllersTest/MarketControllerTest.php | 33 +++++++++++++++---- 13 files changed, 111 insertions(+), 43 deletions(-) create mode 100644 resources/assets/src/components/mixins/alertUnresolvedPlugins.ts diff --git a/app/Http/Controllers/MarketController.php b/app/Http/Controllers/MarketController.php index 62b66f84..5ce8b1b7 100644 --- a/app/Http/Controllers/MarketController.php +++ b/app/Http/Controllers/MarketController.php @@ -82,6 +82,15 @@ class MarketController extends Controller return json(trans('admin.plugins.market.non-existent', ['plugin' => $name]), 1); } + $fakePlugin = new Plugin('', $metadata); + $unsatisfied = $manager->getUnsatisfied($fakePlugin); + $conflicts = $manager->getConflicts($fakePlugin); + if ($unsatisfied->isNotEmpty() || $conflicts->isNotEmpty()) { + $reason = $manager->formatUnresolved($unsatisfied, $conflicts); + + return json(trans('admin.plugins.market.unresolved'), 1, compact('reason')); + } + $url = $metadata['dist']['url']; $filename = Arr::last(explode('/', $url)); $pluginsDir = $manager->getPluginsDirs()->first(); diff --git a/app/Http/Controllers/PluginController.php b/app/Http/Controllers/PluginController.php index de8de735..b724c6fe 100644 --- a/app/Http/Controllers/PluginController.php +++ b/app/Http/Controllers/PluginController.php @@ -59,27 +59,7 @@ class PluginController extends Controller if ($result === true) { return json(trans('admin.plugins.operations.enabled', ['plugin' => $plugin->title]), 0); } else { - $unsatisfied = $result['unsatisfied']->map(function ($detail, $name) use ($plugins) { - $constraint = $detail['constraint']; - if (! $detail['version']) { - $plugin = $plugins->get($name); - $name = $plugin ? trans($plugin->title) : $name; - - return trans('admin.plugins.operations.unsatisfied.disabled', compact('name')); - } else { - $title = trans($plugins->get($name)->title); - - return trans('admin.plugins.operations.unsatisfied.version', compact('title', 'constraint')); - } - })->values()->all(); - - $conflicts = $result['conflicts']->map(function ($detail, $name) use ($plugins) { - $title = trans($plugins->get($name)->title); - - return trans('admin.plugins.operations.unsatisfied.conflict', compact('title')); - })->values()->all(); - - $reason = array_merge($unsatisfied, $conflicts); + $reason = $plugins->formatUnresolved($result['unsatisfied'], $result['conflicts']); return json(trans('admin.plugins.operations.unsatisfied.notice'), 1, compact('reason')); } diff --git a/app/Services/PluginManager.php b/app/Services/PluginManager.php index 701b1243..33c3aebe 100644 --- a/app/Services/PluginManager.php +++ b/app/Services/PluginManager.php @@ -405,6 +405,36 @@ class PluginManager }); } + /** + * Format the "unresolved" information into human-readable text. + */ + public function formatUnresolved( + Collection $unsatisfied, + Collection $conflicts + ): array { + $unsatisfied = $unsatisfied->map(function ($detail, $name) { + $constraint = $detail['constraint']; + if (! $detail['version']) { + $plugin = $this->get($name); + $name = $plugin ? trans($plugin->title) : $name; + + return trans('admin.plugins.operations.unsatisfied.disabled', compact('name')); + } else { + $title = trans($this->get($name)->title); + + return trans('admin.plugins.operations.unsatisfied.version', compact('title', 'constraint')); + } + })->values()->all(); + + $conflicts = $conflicts->map(function ($detail, $name) { + $title = trans($this->get($name)->title); + + return trans('admin.plugins.operations.unsatisfied.conflict', compact('title')); + })->values()->all(); + + return array_merge($unsatisfied, $conflicts); + } + /** * The plugins path. * diff --git a/resources/assets/src/components/mixins/alertUnresolvedPlugins.ts b/resources/assets/src/components/mixins/alertUnresolvedPlugins.ts new file mode 100644 index 00000000..f0acc5b0 --- /dev/null +++ b/resources/assets/src/components/mixins/alertUnresolvedPlugins.ts @@ -0,0 +1,19 @@ +import { showModal } from '../../scripts/notify' + +export default function (message: string, reason: string[]): void { + const div = document.createElement('div') + const p = document.createElement('p') + p.textContent = message + div.appendChild(p) + const ul = document.createElement('ul') + reason.forEach(item => { + const li = document.createElement('li') + li.textContent = item + ul.appendChild(li) + }) + div.appendChild(ul) + showModal({ + mode: 'alert', + dangerousHTML: div.outerHTML, + }) +} diff --git a/resources/assets/src/components/mixins/enablePlugin.ts b/resources/assets/src/components/mixins/enablePlugin.ts index 3c2b7b06..7680540e 100644 --- a/resources/assets/src/components/mixins/enablePlugin.ts +++ b/resources/assets/src/components/mixins/enablePlugin.ts @@ -1,5 +1,6 @@ import Vue from 'vue' import { showModal, toast } from '../../scripts/notify' +import alertUnresolvedPlugins from './alertUnresolvedPlugins' export default Vue.extend({ data: () => ({ plugins: [] }), @@ -32,21 +33,7 @@ export default Vue.extend({ toast.success(message) this.$set(this.plugins[originalIndex], 'enabled', true) } else { - const div = document.createElement('div') - const p = document.createElement('p') - p.textContent = message - div.appendChild(p) - const ul = document.createElement('ul') - reason.forEach(item => { - const li = document.createElement('li') - li.textContent = item - ul.appendChild(li) - }) - div.appendChild(ul) - showModal({ - mode: 'alert', - dangerousHTML: div.outerHTML, - }) + alertUnresolvedPlugins(message, reason) } }, }, diff --git a/resources/assets/src/views/admin/Market.vue b/resources/assets/src/views/admin/Market.vue index fd2fe36d..7a886e8b 100644 --- a/resources/assets/src/views/admin/Market.vue +++ b/resources/assets/src/views/admin/Market.vue @@ -73,6 +73,7 @@