diff --git a/public_html/dispatch.php b/public_html/dispatch.php index f6e181be..84e4a1d6 100644 --- a/public_html/dispatch.php +++ b/public_html/dispatch.php @@ -129,10 +129,11 @@ $tagValidation = \Chibi\Router::register(['TagController', 'relatedView'], 'GET', '/tags-related', $tagValidation); \Chibi\Router::register(['TagController', 'renameView'], 'GET', '/tags-rename', $tagValidation); \Chibi\Router::register(['TagController', 'renameAction'], 'POST', '/tags-rename', $tagValidation); +\Chibi\Router::register(['TagController', 'mergeView'], 'GET', '/tags-merge', $tagValidation); +\Chibi\Router::register(['TagController', 'mergeAction'], 'POST', '/tags-merge', $tagValidation); foreach (['GET', 'POST'] as $method) { - \Chibi\Router::register(['TagController', 'mergeAction'], $method, '/tags-merge', $tagValidation); \Chibi\Router::register(['TagController', 'massTagRedirectAction'], $method, '/mass-tag-redirect', $tagValidation); $userValidations = diff --git a/src/Api/Jobs/MergeTagsJob.php b/src/Api/Jobs/MergeTagsJob.php new file mode 100644 index 00000000..eebb7478 --- /dev/null +++ b/src/Api/Jobs/MergeTagsJob.php @@ -0,0 +1,35 @@ +getArgument(self::SOURCE_TAG_NAME); + $targetTag = $this->getArgument(self::TARGET_TAG_NAME); + + TagModel::removeUnused(); + TagModel::merge($sourceTag, $targetTag); + + LogHelper::log('{user} merged {source} with {target}', [ + 'user' => TextHelper::reprUser(Auth::getCurrentUser()), + 'source' => TextHelper::reprTag($sourceTag), + 'target' => TextHelper::reprTag($targetTag)]); + } + + public function requiresPrivilege() + { + return Privilege::MergeTags; + } + + public function requiresAuthentication() + { + return false; + } + + public function requiresConfirmedEmail() + { + return false; + } +} diff --git a/src/Controllers/TagController.php b/src/Controllers/TagController.php index 2723fece..b0049893 100644 --- a/src/Controllers/TagController.php +++ b/src/Controllers/TagController.php @@ -67,6 +67,12 @@ class TagController }, $ret->entities)); } + public function mergeView() + { + $context = getContext(); + $context->viewName = 'tag-list-wrapper'; + } + public function mergeAction() { $context = getContext(); @@ -74,22 +80,13 @@ class TagController $context->handleExceptions = true; Access::assert(Privilege::MergeTags); - if (!InputHelper::get('submit')) - return; - TagModel::removeUnused(); - - $suppliedSourceTag = InputHelper::get('source-tag'); - $suppliedSourceTag = TagModel::validateTag($suppliedSourceTag); - - $suppliedTargetTag = InputHelper::get('target-tag'); - $suppliedTargetTag = TagModel::validateTag($suppliedTargetTag); - - TagModel::merge($suppliedSourceTag, $suppliedTargetTag); - - LogHelper::log('{user} merged {source} with {target}', [ - 'source' => TextHelper::reprTag($suppliedSourceTag), - 'target' => TextHelper::reprTag($suppliedTargetTag)]); + Api::run( + new MergeTagsJob(), + [ + MergeTagsJob::SOURCE_TAG_NAME => InputHelper::get('source-tag'), + MergeTagsJob::TARGET_TAG_NAME => InputHelper::get('target-tag'), + ]); Messenger::message('Tags merged successfully.'); } diff --git a/src/Views/tag-list-wrapper.phtml b/src/Views/tag-list-wrapper.phtml index 0bf6e836..cfe8bd68 100644 --- a/src/Views/tag-list-wrapper.phtml +++ b/src/Views/tag-list-wrapper.phtml @@ -4,8 +4,8 @@ Assets::addStylesheet('tag-list.css'); $tabs = []; if (Access::check(Privilege::ListTags)) $tabs['list'] = ['List', 'listView']; -if (Access::check(Privilege::MergeTags)) $tabs['merge'] = ['Merge', 'mergeAction']; if (Access::check(Privilege::RenameTags)) $tabs['rename'] = ['Rename', 'renameView']; +if (Access::check(Privilege::MergeTags)) $tabs['merge'] = ['Merge', 'mergeView']; if (Access::check(Privilege::MassTag)) $tabs['mass-tag-redirect'] = ['Mass tag', 'massTagRedirectAction']; $showTabs = count($tabs) > 1; ?>