Dont send all likes with list of comments

Due to historic reasons with a comment the list of all likes was sent to the frontend.
This is needed just to detect if one of the likes is current users like.
So if sending just the own like, the frontend can do it's job.

When the frontend is refactured in any way, post and comment like handling should be improved.
This commit is contained in:
Thorsten Claus
2022-09-04 17:19:00 +02:00
committed by Benjamin Neff
parent c2a2fb63b0
commit 9c0f8cdf11
4 changed files with 36 additions and 18 deletions

View File

@@ -37,16 +37,17 @@
{{{text}}}
</div>
<div class="info">
<a href="#" class="like" rel='nofollow'>
{{~#if userLike~}}
{{~t "stream.unlike"~}}
{{~else~}}
{{~t "stream.like"~}}
{{~/if~}}
</a>
</div>
{{#if loggedIn}}
<div class="info">
<a href="#" class="like" rel='nofollow'>
{{~#if userLike~}}
{{~t "stream.unlike"~}}
{{~else~}}
{{~t "stream.like"~}}
{{~/if~}}
</a>
</div>
{{/if}}
<div class="likes likes-on-comment"> </div>
</div>

View File

@@ -49,7 +49,7 @@ class CommentsController < ApplicationController
def index
comments = comment_service.find_for_post(params[:post_id])
respond_with do |format|
format.json { render json: CommentPresenter.as_collection(comments), status: 200 }
format.json { render json: CommentPresenter.as_collection(comments, :as_json, current_user), status: 200 }
format.mobile { render layout: false, locals: {comments: comments} }
end
end

View File

@@ -1,7 +1,7 @@
# frozen_string_literal: true
class CommentPresenter < BasePresenter
def as_json(opts={})
def as_json(_opts={})
{
id: id,
guid: guid,
@@ -27,14 +27,14 @@ class CommentPresenter < BasePresenter
def build_interaction_state
{
liked: current_user.present? && likes.where(author: current_user.person).exists?,
likes_count: likes_count
liked: current_user.present? && likes.exists?(author: current_user.person),
likes_count: likes_count
}
end
def build_interactions_json
{
likes: as_api(likes),
likes: as_api(own_likes(likes)),
likes_count: likes_count
}
end
@@ -43,6 +43,18 @@ class CommentPresenter < BasePresenter
mentioned_people.map {|m| PersonPresenter.new(m).as_api_json }
end
# TODO: Only send the own_like boolean.
# Frontend uses the same methods for post-likes as for comment-likes
# Whenever the frontend will be refactored, just send the own_like boolean, instead of a full list of likes
# The list of likes is already send when API requests the full list.
def own_likes(likes)
if current_user
likes.where(author: current_user.person)
else
likes.none
end
end
def as_api(collection)
collection.includes(author: :profile).map {|element|
element.as_api_response(:backbone)

View File

@@ -5,9 +5,14 @@ class LastThreeCommentsDecorator
@presenter = presenter
end
def as_json(options={})
def as_json(_options={})
current_user = @presenter.current_user
@presenter.as_json.tap do |post|
post[:interactions].merge!(:comments => CommentPresenter.as_collection(@presenter.post.last_three_comments))
post[:interactions].merge!(comments: CommentPresenter.as_collection(
@presenter.post.last_three_comments,
:as_json,
current_user
))
end
end
end
end