diff --git a/public_html/dispatch.php b/public_html/dispatch.php index 482dea41..990df736 100644 --- a/public_html/dispatch.php +++ b/public_html/dispatch.php @@ -81,6 +81,7 @@ $postValidation = \Chibi\Router::register(['PostController', 'favoritesView'], 'GET', '/favorites/{page}', $postValidation); \Chibi\Router::register(['PostController', 'upvotedView'], 'GET', '/upvoted', $postValidation); \Chibi\Router::register(['PostController', 'upvotedView'], 'GET', '/upvoted/{page}', $postValidation); +\Chibi\Router::register(['PostController', 'toggleTagAction'], 'POST', '/post/{id}/toggle-tag/{tag}/{enable}', $postValidation); \Chibi\Router::register(['CommentController', 'listView'], 'GET', '/comments'); \Chibi\Router::register(['CommentController', 'listView'], 'GET', '/comments/{page}', ['page' => '\d+']); @@ -92,7 +93,6 @@ $postValidation = foreach (['GET', 'POST'] as $method) { \Chibi\Router::register(['PostController', 'uploadAction'], $method, '/posts/upload', $postValidation); - \Chibi\Router::register(['PostController', 'toggleTagAction'], $method, '/post/{id}/toggle-tag/{tag}/{enable}', $postValidation); \Chibi\Router::register(['PostController', 'viewAction'], $method, '/post/{id}', $postValidation); \Chibi\Router::register(['PostController', 'retrieveAction'], $method, '/post/{name}/retrieve', $postValidation); \Chibi\Router::register(['PostController', 'thumbAction'], $method, '/post/{name}/thumb', $postValidation); diff --git a/public_html/media/js/post-list.js b/public_html/media/js/post-list.js index 99303353..2679fec5 100644 --- a/public_html/media/js/post-list.js +++ b/public_html/media/js/post-list.js @@ -14,7 +14,7 @@ $(function() var enable = !aDom.parents('.post').hasClass('tagged'); var url = $(this).attr('href') + '?json'; url = url.replace('_enable_', enable ? '1' : '0'); - $.get(url, {submit: 1}).success(function(data) + $.post(url).success(function(data) { aDom.removeClass('inactive'); aDom.parents('.post').removeClass('tagged'); diff --git a/src/Controllers/PostController.php b/src/Controllers/PostController.php index 661a1d6c..3e23aed2 100644 --- a/src/Controllers/PostController.php +++ b/src/Controllers/PostController.php @@ -71,49 +71,17 @@ class PostController public function toggleTagAction($id, $tag, $enable) { - $context = getContext(); - $tagName = $tag; - $post = PostModel::findByIdOrName($id); - $context->transport->post = $post; - - if (!InputHelper::get('submit')) - return; - Access::assert( Privilege::MassTag, - Access::getIdentity($post->getUploader())); + Access::getIdentity(PostModel::findById($id)->getUploader())); - $tags = $post->getTags(); - - if (!$enable) - { - foreach ($tags as $i => $tag) - if ($tag->name == $tagName) - unset($tags[$i]); - - LogHelper::log('{user} untagged {post} with {tag}', [ - 'post' => TextHelper::reprPost($post), - 'tag' => TextHelper::reprTag($tag)]); - } - elseif ($enable) - { - $tag = TagModel::findByName($tagName, false); - if ($tag === null) - { - $tag = TagModel::spawn(); - $tag->name = $tagName; - TagModel::save($tag); - } - - $tags []= $tag; - LogHelper::log('{user} tagged {post} with {tag}', [ - 'post' => TextHelper::reprPost($post), - 'tag' => TextHelper::reprTag($tag)]); - } - - $post->setTags($tags); - - PostModel::save($post); + Api::run( + new TogglePostTagJob(), + [ + JobArgs::POST_ID => $id, + JobArgs::TAG_NAME => $tag, + JobArgs::STATE => $enable, + ]); } public function uploadAction() diff --git a/src/Jobs/Abstraction/AbstractPostEditJob.php b/src/Jobs/Abstraction/AbstractPostEditJob.php new file mode 100644 index 00000000..b9eae98f --- /dev/null +++ b/src/Jobs/Abstraction/AbstractPostEditJob.php @@ -0,0 +1,11 @@ +getArgument(JobArgs::POST_ID); + $this->post = PostModel::findByIdOrName($postId); + } +} diff --git a/src/Jobs/Abstraction/JobArgs.php b/src/Jobs/Abstraction/JobArgs.php index 6a6963b1..0810036b 100644 --- a/src/Jobs/Abstraction/JobArgs.php +++ b/src/Jobs/Abstraction/JobArgs.php @@ -3,8 +3,10 @@ class JobArgs { const COMMENT_ID = 'comment-id'; const POST_ID = 'post-id'; + const TAG_NAME = 'tag-name'; const TEXT = 'text'; const PAGE_NUMBER = 'page-number'; const QUERY = 'query'; const LOG_ID = 'log-id'; + const STATE = 'state'; } diff --git a/src/Jobs/TogglePostTagJob.php b/src/Jobs/TogglePostTagJob.php new file mode 100644 index 00000000..642fe14e --- /dev/null +++ b/src/Jobs/TogglePostTagJob.php @@ -0,0 +1,70 @@ +getArgument(JobArgs::TAG_NAME); + $enable = boolval($this->getArgument(JobArgs::STATE)); + $post = $this->post; + + $tags = $post->getTags(); + + if ($enable) + { + $tag = TagModel::findByName($tagName, false); + if ($tag === null) + { + $tag = TagModel::spawn(); + $tag->name = $tagName; + TagModel::save($tag); + } + + $tags []= $tag; + } + else + { + foreach ($tags as $i => $tag) + if ($tag->name == $tagName) + unset($tags[$i]); + } + + $post->setTags($tags); + PostModel::save($post); + + if ($enable) + { + LogHelper::log('{user} tagged {post} with {tag}', [ + 'user' => TextHelper::reprUser(Auth::getCurrentUser()), + 'post' => TextHelper::reprPost($post), + 'tag' => TextHelper::reprTag($tag)]); + } + else + { + LogHelper::log('{user} untagged {post} with {tag}', [ + 'user' => TextHelper::reprUser(Auth::getCurrentUser()), + 'post' => TextHelper::reprPost($post), + 'tag' => TextHelper::reprTag($tag)]); + } + + return $post; + } + + public function requiresPrivilege() + { + return + [ + Privilege::EditPostTags, + Access::getIdentity($this->post->getUploader()) + ]; + } + + public function requiresAuthentication() + { + return false; + } + + public function requiresConfirmedEmail() + { + return false; + } +}