Bring back likes on comments

This commit is contained in:
flaburgan 2018-10-23 23:26:52 +02:00 committed by Benjamin Neff
parent bb882daeae
commit 82ff57a750
No known key found for this signature in database
GPG key ID: 971464C3F1A90194
6 changed files with 84 additions and 5 deletions

View file

@ -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

View file

@ -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

View file

@ -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();
}
});

View file

@ -36,5 +36,15 @@
<div class="collapsible comment-content markdown-content">
{{{text}}}
</div>
<div class="info">
<a href="#" class="like" rel='nofollow'>
{{~#if userLike~}}
{{~t "stream.unlike"~}}
{{~else~}}
{{~t "stream.like"~}}
{{~/if~}}
</a>
</div>
</div>
</div>

View file

@ -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

View file

@ -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