From 82ff57a750abf91190170c20acf0d3709fc19069 Mon Sep 17 00:00:00 2001 From: flaburgan Date: Tue, 23 Oct 2018 23:26:52 +0200 Subject: [PATCH] Bring back likes on comments --- .../javascripts/app/collections/likes.js | 5 +- app/assets/javascripts/app/models/comment.js | 49 ++++++++++++++++++- .../javascripts/app/views/comment_view.js | 8 ++- app/assets/templates/comment_tpl.jst.hbs | 10 ++++ app/controllers/likes_controller.rb | 6 ++- app/services/like_service.rb | 11 ++++- 6 files changed, 84 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/app/collections/likes.js b/app/assets/javascripts/app/collections/likes.js index 76168237b..7eabdc6e4 100644 --- a/app/assets/javascripts/app/collections/likes.js +++ b/app/assets/javascripts/app/collections/likes.js @@ -4,7 +4,10 @@ app.collections.Likes = Backbone.Collection.extend({ model: app.models.Like, initialize : function(models, options) { - this.url = "/posts/" + options.post.id + "/likes"; //not delegating to post.url() because when it is in a stream collection it delegates to that url + this.url = (options.post != null) ? + // not delegating to post.url() because when it is in a stream collection it delegates to that url + "/posts/" + options.post.id + "/likes" : + "/comments/" + options.comment.id + "/likes"; } }); // @license-end diff --git a/app/assets/javascripts/app/models/comment.js b/app/assets/javascripts/app/models/comment.js index d382b731f..da1e017b5 100644 --- a/app/assets/javascripts/app/models/comment.js +++ b/app/assets/javascripts/app/models/comment.js @@ -1,6 +1,53 @@ // @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later app.models.Comment = Backbone.Model.extend({ - urlRoot: "/comments" + urlRoot: "/comments", + + initialize: function() { + this.likes = new app.collections.Likes(this.get("likes"), {comment: this}); + }, + + // Copied from Post.Interaction. To be merged in an "interactable" class once comments can be commented too + likesCount: function() { + return this.get("likes_count"); + }, + + userLike: function() { + return this.likes.select(function(like) { + return like.get("author") && like.get("author").guid === app.currentUser.get("guid"); + })[0]; + }, + + toggleLike: function() { + if (this.userLike()) { + this.unlike(); + } else { + this.like(); + } + }, + + like: function() { + var self = this; + this.likes.create({}, { + success: function() { + self.post.set({participation: true}); + self.trigger("change"); + self.set({"likes_count": self.get("likes_count") + 1}); + self.likes.trigger("change"); + }, + error: function(model, response) { + app.flashMessages.handleAjaxError(response); + } + }); + }, + + unlike: function() { + var self = this; + this.userLike().destroy({success: function() { + self.trigger("change"); + self.set({"likes_count": self.get("likes_count") - 1}); + self.likes.trigger("change"); + }}); + } }); // @license-end diff --git a/app/assets/javascripts/app/views/comment_view.js b/app/assets/javascripts/app/views/comment_view.js index a75150290..1cd04ab62 100644 --- a/app/assets/javascripts/app/views/comment_view.js +++ b/app/assets/javascripts/app/views/comment_view.js @@ -9,7 +9,8 @@ app.views.Comment = app.views.Content.extend({ events : function() { return _.extend({}, app.views.Content.prototype.events, { "click .comment_delete": "destroyModel", - "click .comment_report": "report" + "click .comment_report": "report", + "click .like": "toggleLike" }); }, @@ -35,6 +36,11 @@ app.views.Comment = app.views.Content.extend({ canRemove : function() { return app.currentUser.authenticated() && (this.ownComment() || this.postOwner()); + }, + + toggleLike: function(evt) { + if (evt) { evt.preventDefault(); } + this.model.toggleLike(); } }); diff --git a/app/assets/templates/comment_tpl.jst.hbs b/app/assets/templates/comment_tpl.jst.hbs index 36d56ef1c..dd9480548 100644 --- a/app/assets/templates/comment_tpl.jst.hbs +++ b/app/assets/templates/comment_tpl.jst.hbs @@ -36,5 +36,15 @@
{{{text}}}
+ +
+ +
diff --git a/app/controllers/likes_controller.rb b/app/controllers/likes_controller.rb index bdc43809f..ef79d0ad0 100644 --- a/app/controllers/likes_controller.rb +++ b/app/controllers/likes_controller.rb @@ -17,7 +17,11 @@ class LikesController < ApplicationController end def create - like = like_service.create(params[:post_id]) + like = if params[:post_id] + like_service.create_for_post(params[:post_id]) + else + like_service.create_for_comment(params[:comment_id]) + end rescue ActiveRecord::RecordNotFound, ActiveRecord::RecordInvalid render plain: I18n.t("likes.create.error"), status: 422 else diff --git a/app/services/like_service.rb b/app/services/like_service.rb index e86493813..f3a17a6b3 100644 --- a/app/services/like_service.rb +++ b/app/services/like_service.rb @@ -5,11 +5,16 @@ class LikeService @user = user end - def create(post_id) + def create_for_post(post_id) post = post_service.find!(post_id) user.like!(post) end + def create_for_comment(comment_id) + comment = comment_service.find!(comment_id) + user.like!(comment) + end + def destroy(like_id) like = Like.find(like_id) if user.owns?(like) @@ -43,4 +48,8 @@ class LikeService def post_service @post_service ||= PostService.new(user) end + + def comment_service + @comment_service ||= CommentService.new(user) + end end