Class: Decidim::Comments::Comment

Inherits:
ApplicationRecord show all
Includes:
Authorable, Commentable, DataPortability, FriendlyDates, Loggable, Reportable, Searchable, Traceable, TranslatableAttributes, TranslatableResource
Defined in:
app/models/decidim/comments/comment.rb

Overview

Some resources will be configured as commentable objects so users can comment on them. The will be able to create conversations between users to discuss or share their thoughts about the resource.

Constant Summary collapse

MAX_DEPTH =

Limit the max depth of a comment tree. If C is a comment and R is a reply: C (depth 0) |–R (depth 1) |–R (depth 1)

|--R    (depth 2)
   |--R (depth 3)
3

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.export_serializerObject



150
151
152
# File 'app/models/decidim/comments/comment.rb', line 150

def self.export_serializer
  Decidim::Comments::CommentSerializer
end

.negativeObject



77
78
79
# File 'app/models/decidim/comments/comment.rb', line 77

def self.negative
  where(alignment: -1)
end

.neutralObject



73
74
75
# File 'app/models/decidim/comments/comment.rb', line 73

def self.neutral
  where(alignment: 0)
end

.positiveObject



69
70
71
# File 'app/models/decidim/comments/comment.rb', line 69

def self.positive
  where(alignment: 1)
end

.user_commentators_ids_in(resources) ⇒ Object

Public: Returns the list of author IDs of type ‘UserBaseEntity` that commented in one of the resources. Expects all resources to be of the same “commentable_type”. If the result is not `Decidim::Comments::Commentable` returns `nil`.



157
158
159
160
161
162
163
164
165
166
167
# File 'app/models/decidim/comments/comment.rb', line 157

def self.user_commentators_ids_in(resources)
  if resources.first&.kind_of?(Decidim::Comments::Commentable)
    commentable_type = resources.first.class.name
    Decidim::Comments::Comment.select("DISTINCT decidim_author_id").not_hidden.not_deleted
                              .where(decidim_commentable_id: resources.pluck(:id))
                              .where(decidim_commentable_type: commentable_type)
                              .where("decidim_author_type" => "Decidim::UserBaseEntity").pluck(:decidim_author_id)
  else
    []
  end
end

Instance Method Details

#accepts_new_comments?Boolean

Public: Override Commentable concern method ‘accepts_new_comments?`

Returns:

  • (Boolean)


99
100
101
102
103
# File 'app/models/decidim/comments/comment.rb', line 99

def accepts_new_comments?
  return if deleted?

  root_commentable.accepts_new_comments? && depth < MAX_DEPTH
end

#can_participate?(user) ⇒ Boolean

Returns:

  • (Boolean)


169
170
171
172
173
# File 'app/models/decidim/comments/comment.rb', line 169

def can_participate?(user)
  return true unless root_commentable&.respond_to?(:can_participate?)

  root_commentable.can_participate?(user)
end

#componentObject



94
95
96
# File 'app/models/decidim/comments/comment.rb', line 94

def component
  commentable.component if commentable.respond_to?(:component)
end

#delete!Object



183
184
185
186
187
188
189
# File 'app/models/decidim/comments/comment.rb', line 183

def delete!
  return if deleted?

  update(deleted_at: Time.current)

  update_counter
end

#deleted?Boolean

Returns:

  • (Boolean)


191
192
193
# File 'app/models/decidim/comments/comment.rb', line 191

def deleted?
  deleted_at.present?
end

#down_voted_by?(user) ⇒ Boolean

Public: Check if the user has downvoted the comment

Returns a bool value to indicate if the condition is truthy or not

Returns:

  • (Boolean)


125
126
127
# File 'app/models/decidim/comments/comment.rb', line 125

def down_voted_by?(user)
  down_votes.any? { |vote| vote.author == user }
end

#edited?Boolean

Returns:

  • (Boolean)


195
196
197
# File 'app/models/decidim/comments/comment.rb', line 195

def edited?
  Decidim::ActionLog.where(resource: self).exists?(["extra @> ?", Arel.sql("{\"edit\":true}")])
end

#formatted_bodyObject



175
176
177
# File 'app/models/decidim/comments/comment.rb', line 175

def formatted_body
  Decidim::ContentProcessor.render(sanitize_content_for_comment(render_markdown(translated_body)), "div")
end

#original_participatory_spaceObject



85
# File 'app/models/decidim/comments/comment.rb', line 85

alias original_participatory_space participatory_space

#participatory_spaceObject



87
88
89
90
91
92
# File 'app/models/decidim/comments/comment.rb', line 87

def participatory_space
  return original_participatory_space if original_participatory_space.present?
  return root_commentable unless root_commentable.respond_to?(:participatory_space)

  root_commentable.participatory_space
end

#reported_attributesObject

Public: Overrides the ‘reported_attributes` Reportable concern method.



141
142
143
# File 'app/models/decidim/comments/comment.rb', line 141

def reported_attributes
  [:body]
end

#reported_content_urlObject

Public: Overrides the ‘reported_content_url` Reportable concern method.



130
131
132
133
134
135
136
137
138
# File 'app/models/decidim/comments/comment.rb', line 130

def reported_content_url
  url_params = { anchor: "comment_#{id}" }

  if root_commentable&.respond_to?(:polymorphic_resource_url)
    root_commentable.polymorphic_resource_url(url_params)
  else
    ResourceLocatorPresenter.new(root_commentable).url(url_params)
  end
end

#reported_searchable_content_extrasObject

Public: Overrides the ‘reported_searchable_content_extras` Reportable concern method.



146
147
148
# File 'app/models/decidim/comments/comment.rb', line 146

def reported_searchable_content_extras
  [normalized_author.name]
end

#translated_bodyObject



179
180
181
# File 'app/models/decidim/comments/comment.rb', line 179

def translated_body
  translated_attribute(body, organization)
end

#up_voted_by?(user) ⇒ Boolean

Public: Check if the user has upvoted the comment

Returns a bool value to indicate if the condition is truthy or not

Returns:

  • (Boolean)


118
119
120
# File 'app/models/decidim/comments/comment.rb', line 118

def up_voted_by?(user)
  up_votes.any? { |vote| vote.author == user }
end

#users_to_notify_on_comment_createdObject

Public: Override Commentable concern method ‘users_to_notify_on_comment_created`. Return the comment author together with whatever ActiveRecord::Relation is returned by the `commentable`. This will cause the comment author to be notified when the comment is replied



109
110
111
112
113
# File 'app/models/decidim/comments/comment.rb', line 109

def users_to_notify_on_comment_created
  Decidim::User.where(id: commentable.users_to_notify_on_comment_created).or(
    Decidim::User.where(id: decidim_author_id)
  )
end

#visible?Boolean

Returns:

  • (Boolean)


81
82
83
# File 'app/models/decidim/comments/comment.rb', line 81

def visible?
  participatory_space.try(:visible?) && component.try(:published?)
end