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;
+ }
+}