From a140e04ca39d85b2ca9982b93a237706d7baad47 Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Tue, 23 Sep 2014 20:18:12 +0200 Subject: [PATCH] Added post deleting --- TODO | 1 - data/config.ini | 1 + public_html/js/Auth.js | 1 + public_html/js/Presenters/PostPresenter.js | 25 +++++++++++++++++++++- public_html/templates/post.tpl | 15 +++++++++++++ src/Controllers/PostController.php | 7 ++++++ src/Privilege.php | 1 + src/Services/PostService.php | 9 ++++++++ 8 files changed, 58 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index 778a5e8f..0f86cd51 100644 --- a/TODO +++ b/TODO @@ -7,7 +7,6 @@ everything related to posts: - time of last edit - time of last feature - how many times the post was featured - - delete - feature - fav - score (see notes about scoring) diff --git a/data/config.ini b/data/config.ini index 2fc95160..c6fb52b9 100644 --- a/data/config.ini +++ b/data/config.ini @@ -41,6 +41,7 @@ listSketchyPosts = anonymous, regularUser, powerUser, moderator, administ listUnsafePosts = anonymous, regularUser, powerUser, moderator, administrator uploadPosts = regularUser, powerUser, moderator, administrator uploadPostsAnonymously = regularUser, powerUser, moderator, administrator +deletePosts = moderator, administrator listTags = anonymous, regularUser, powerUser, moderator, administrator diff --git a/public_html/js/Auth.js b/public_html/js/Auth.js index 2ffcf07d..e4fced09 100644 --- a/public_html/js/Auth.js +++ b/public_html/js/Auth.js @@ -23,6 +23,7 @@ App.Auth = function(_, jQuery, util, api, appState, promise) { listUnsafePosts: 'listUnsafePosts', uploadPosts: 'uploadPosts', uploadPostsAnonymously: 'uploadPostsAnonymously', + deletePosts: 'deletePosts', listTags: 'listTags', }; diff --git a/public_html/js/Presenters/PostPresenter.js b/public_html/js/Presenters/PostPresenter.js index 3818907e..a042b55c 100644 --- a/public_html/js/Presenters/PostPresenter.js +++ b/public_html/js/Presenters/PostPresenter.js @@ -7,6 +7,8 @@ App.Presenters.PostPresenter = function( util, promise, api, + auth, + router, topNavigationPresenter, messagePresenter) { @@ -16,11 +18,14 @@ App.Presenters.PostPresenter = function( var postContentTemplate; var post; var postNameOrId; + var privileges = {}; function init(args, loaded) { postNameOrId = args.postNameOrId; topNavigationPresenter.select('posts'); + privileges.canDeletePosts = auth.hasPrivilege(auth.privileges.deletePosts); + promise.waitAll( util.promiseTemplate('post'), util.promiseTemplate('post-content'), @@ -50,7 +55,25 @@ App.Presenters.PostPresenter = function( formatRelativeTime: util.formatRelativeTime, formatFileSize: util.formatFileSize, postContentTemplate: postContentTemplate, + privileges: privileges, })); + + $el.find('.delete').click(deleteButtonClicked); + } + + function deleteButtonClicked(e) { + e.preventDefault(); + if (window.confirm('Do you really want to delete this post?')) { + deletePost(); + } + } + + function deletePost() { + api.delete('/posts/' + post.id).then(function(response) { + router.navigate('#/posts'); + }).fail(function(response) { + messagePresenter.showError($messages, response.json && response.json.error || response); + }); } return { @@ -60,4 +83,4 @@ App.Presenters.PostPresenter = function( }; -App.DI.register('postPresenter', ['_', 'jQuery', 'util', 'promise', 'api', 'topNavigationPresenter', 'messagePresenter'], App.Presenters.PostPresenter); +App.DI.register('postPresenter', ['_', 'jQuery', 'util', 'promise', 'api', 'auth', 'router', 'topNavigationPresenter', 'messagePresenter'], App.Presenters.PostPresenter); diff --git a/public_html/templates/post.tpl b/public_html/templates/post.tpl index 340da497..4a6cba7f 100644 --- a/public_html/templates/post.tpl +++ b/public_html/templates/post.tpl @@ -79,6 +79,21 @@ <% } %> + + <% if (_.any(privileges)) { %> +

Options

+ + + <% } %> +
diff --git a/src/Controllers/PostController.php b/src/Controllers/PostController.php index eaef7a78..2b2b5dc8 100644 --- a/src/Controllers/PostController.php +++ b/src/Controllers/PostController.php @@ -25,6 +25,7 @@ final class PostController extends AbstractController $router->post('/api/posts', [$this, 'createPost']); $router->get('/api/posts', [$this, 'getFiltered']); $router->get('/api/posts/:postNameOrId', [$this, 'getByNameOrId']); + $router->delete('/api/posts/:postNameOrId', [$this, 'deletePost']); } public function getByNameOrId($postNameOrId) @@ -57,4 +58,10 @@ final class PostController extends AbstractController $post = $this->postService->createPost($formData); return $this->postViewProxy->fromEntity($post); } + + public function deletePost($postNameOrId) + { + $post = $this->postService->getByNameOrId($postNameOrId); + $this->postService->deletePost($post); + } } diff --git a/src/Privilege.php b/src/Privilege.php index 8032bc75..f349dd08 100644 --- a/src/Privilege.php +++ b/src/Privilege.php @@ -23,6 +23,7 @@ class Privilege const LIST_UNSAFE_POSTS = 'listUnsafePosts'; const UPLOAD_POSTS = 'uploadPosts'; const UPLOAD_POSTS_ANONYMOUSLY = 'uploadPostsAnonymously'; + const DELETE_POSTS = 'deletePosts'; const LIST_TAGS = 'listTags'; } diff --git a/src/Services/PostService.php b/src/Services/PostService.php index 9c930497..02a50946 100644 --- a/src/Services/PostService.php +++ b/src/Services/PostService.php @@ -190,6 +190,15 @@ class PostService $post->setTags($tags); } + public function deletePost(\Szurubooru\Entities\Post $post) + { + $transactionFunc = function() use ($post) + { + $this->postDao->deleteById($post->getId()); + }; + $this->transactionManager->commit($transactionFunc); + } + private function assertNoPostWithThisContentChecksum(\Szurubooru\Entities\Post $parent) { $checksumToCheck = $parent->getContentChecksum();