diff --git a/app/assets/javascripts/discourse/controllers/topic_controller.js b/app/assets/javascripts/discourse/controllers/topic_controller.js index 18665c8c88b..7a6f15c0c51 100644 --- a/app/assets/javascripts/discourse/controllers/topic_controller.js +++ b/app/assets/javascripts/discourse/controllers/topic_controller.js @@ -378,15 +378,7 @@ Discourse.TopicController = Discourse.ObjectController.extend(Discourse.Selected }, deletePost: function(post) { - // Moderators can delete posts. Regular users can only create a deleted at message. - if (Discourse.User.current('staff')) { - post.set('deleted_at', new Date()); - } else { - post.set('cooked', Discourse.Markdown.cook(I18n.t("post.deleted_by_author"))); - post.set('can_delete', false); - post.set('version', post.get('version') + 1); - } - post.destroy(); + post.destroy(Discourse.User.current()); }, removeAllowedUser: function(username) { diff --git a/app/assets/javascripts/discourse/models/post.js b/app/assets/javascripts/discourse/models/post.js index 7b450d1584f..551ad65a18f 100644 --- a/app/assets/javascripts/discourse/models/post.js +++ b/app/assets/javascripts/discourse/models/post.js @@ -189,7 +189,21 @@ Discourse.Post = Discourse.Model.extend({ return Discourse.ajax("/posts/" + (this.get('id')) + "/recover", { type: 'PUT', cache: false }); }, - destroy: function(complete) { + destroy: function(deleted_by) { + // Moderators can delete posts. Regular users can only trigger a deleted at message. + if (deleted_by.get('staff')) { + this.setProperties({ + deleted_at: new Date(), + deleted_by: deleted_by + }); + } else { + this.setProperties({ + cooked: Discourse.Markdown.cook(I18n.t("post.deleted_by_author")), + can_delete: false, + version: this.get('version') + 1 + }); + } + return Discourse.ajax("/posts/" + (this.get('id')), { type: 'DELETE' }); }, diff --git a/test/javascripts/models/post_test.js b/test/javascripts/models/post_test.js index 746c3b6a266..cf19235f548 100644 --- a/test/javascripts/models/post_test.js +++ b/test/javascripts/models/post_test.js @@ -1,5 +1,19 @@ module("Discourse.Post"); +var buildPost = function(args) { + return Discourse.Post.create(_.merge({ + id: 1, + can_delete: true, + version: 1 + }, args || {})); +}; + +test('defaults', function() { + var post = Discourse.Post.create({id: 1}); + blank(post.get('deleted_at'), "it has no deleted_at by default"); + blank(post.get('deleted_by'), "there is no deleted_by by default"); +}); + test('new_user', function() { var post = Discourse.Post.create({trust_level: 0}); ok(post.get('new_user'), "post is from a new user"); @@ -16,7 +30,6 @@ test('firstPost', function() { ok(!post.get('firstPost'), "post is no longer the first post"); }); - test('updateFromPost', function() { var post = Discourse.Post.create({ post_number: 1, @@ -32,13 +45,38 @@ test('updateFromPost', function() { }); test('hasHistory', function() { - var post = Discourse.Post.create({id: 1}); ok(!post.get('hasHistory'), 'posts without versions have no history'); post.set('version', 1); ok(!post.get('hasHistory'), 'posts with one version have no history'); post.set('version', 2); ok(post.get('hasHistory'), 'posts with more than one version have a history'); +}); -}); \ No newline at end of file +test('destroy by staff', function() { + var user = Discourse.User.create({username: 'staff', staff: true}); + var post = buildPost({user: user}); + + this.stub(Discourse, 'ajax'); + post.destroy(user); + + present(post.get('deleted_at'), "it has a `deleted_at` field."); + equal(post.get('deleted_by'), user, "it has the user in the `deleted_by` field"); + ok(Discourse.ajax.calledOnce, "it made an AJAX call"); +}); + +test('destroy by non-staff', function() { + var originalCooked = "this is the original cooked value"; + var user = Discourse.User.create({username: 'evil trout'}); + var post = buildPost({user: user, cooked: originalCooked}); + + this.stub(Discourse, 'ajax'); + post.destroy(user); + + ok(!post.get('can_delete'), "the post can't be deleted again in this session"); + ok(post.get('cooked') !== originalCooked, "the cooked content changed"); + equal(post.get('version'), 2, "the version number increased"); + ok(Discourse.ajax.calledOnce, "it made an AJAX call"); +}); +