Class: Decidim::Comments::Comment

Inherits:
ApplicationRecord show all
Includes:
ActsAsTree, Authorable, Commentable, DownloadYourData, FriendlyDates, Loggable, Reportable, Searchable, Traceable, TranslatableAttributes, TranslatableResource
Defined in:
decidim-comments/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

Methods included from TranslatableAttributes

#default_locale?

Methods included from FriendlyDates

#friendly_created_at

Class Method Details

.export_serializerObject


153
154
155
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 153

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

.negativeObject


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

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

.neutralObject


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

def self.neutral
  where(alignment: 0)
end

.positiveObject


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

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`.


160
161
162
163
164
165
166
167
168
169
170
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 160

def self.user_commentators_ids_in(resources)
  if resources.first.is_a?(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)

102
103
104
105
106
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 102

def accepts_new_comments?
  return if deleted?

  root_commentable.accepts_new_comments? && depth < MAX_DEPTH
end

#can_participate?(user) ⇒ Boolean

Returns:

  • (Boolean)

172
173
174
175
176
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 172

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

  root_commentable.can_participate?(user)
end

#componentObject


97
98
99
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 97

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

#delete!Object


186
187
188
189
190
191
192
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 186

def delete!
  return if deleted?

  update(deleted_at: Time.current)

  update_counter
end

#deleted?Boolean

Returns:

  • (Boolean)

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

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)

128
129
130
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 128

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

#edited?Boolean

Returns:

  • (Boolean)

198
199
200
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 198

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

#formatted_bodyObject


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

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

#original_participatory_spaceObject


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

alias original_participatory_space participatory_space

#participatory_spaceObject


90
91
92
93
94
95
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 90

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.


144
145
146
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 144

def reported_attributes
  [:body]
end

#reported_content_urlObject

Public: Overrides the `reported_content_url` Reportable concern method.


133
134
135
136
137
138
139
140
141
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 133

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.


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

def reported_searchable_content_extras
  [normalized_author.name]
end

#translated_bodyObject


182
183
184
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 182

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)

121
122
123
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 121

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


112
113
114
115
116
# File 'decidim-comments/app/models/decidim/comments/comment.rb', line 112

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)

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

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