discourse/app/serializers/topic_view_details_serializer.rb
Roman Rizzi e52ccaa51f
FIX: Users can remove themselves from a PM even if they can still access it through a group. (#11693)
If a group you're a member of is invited to a PM, you can no longer remove yourself from it. This means you won't be able to remove the message from your inbox, and even if you archive it, it'll come back once someone replies.
2021-01-13 11:27:23 -03:00

184 lines
4.7 KiB
Ruby

# frozen_string_literal: true
class TopicViewDetailsSerializer < ApplicationSerializer
def self.can_attributes
[:can_move_posts,
:can_delete,
:can_recover,
:can_remove_allowed_users,
:can_invite_to,
:can_invite_via_email,
:can_create_post,
:can_reply_as_new_topic,
:can_flag_topic,
:can_convert_topic,
:can_review_topic,
:can_edit_tags,
:can_publish_page,
:can_close_topic,
:can_archive_topic,
:can_split_merge_topic,
:can_edit_staff_notes,
:can_toggle_topic_visibility,
:can_moderate_category]
end
# NOTE: `can_edit` is defined as an attribute because we explicitly want
# it returned even if it has a value of `false`
attributes(
:can_edit,
:notification_level,
:notifications_reason_id,
*can_attributes,
:can_remove_self_id,
:participants,
:allowed_users
)
has_one :created_by, serializer: BasicUserSerializer, embed: :objects
has_one :last_poster, serializer: BasicUserSerializer, embed: :objects
has_many :links, serializer: TopicLinkSerializer, embed: :objects
has_many :participants, serializer: TopicPostCountSerializer, embed: :objects
has_many :allowed_users, serializer: BasicUserSerializer, embed: :objects
has_many :allowed_groups, serializer: BasicGroupSerializer, embed: :objects
def participants
object.post_counts_by_user.reject { |p| object.participants[p].blank? }.map do |pc|
{ user: object.participants[pc[0]], post_count: pc[1] }
end
end
def include_participants?
object.post_counts_by_user.present?
end
def include_links?
object.links.present?
end
def created_by
object.topic.user
end
def last_poster
object.topic.last_poster
end
def notification_level
object.topic_user&.notification_level || TopicUser.notification_levels[:regular]
end
def notifications_reason_id
object.topic_user.notifications_reason_id
end
def include_notifications_reason_id?
object.topic_user.present?
end
# confusingly this is an id, not a bool like all other `can` methods
def can_remove_self_id
scope.user.id
end
def include_can_remove_self_id?
scope.can_remove_allowed_users?(object.topic, scope.user)
end
can_attributes.each do |ca|
define_method(ca) { true }
end
# NOTE: A Category Group Moderator moving a topic to a different category
# may result in the 'can_edit?' result changing from `true` to `false`.
# Explictly returning a `false` value is required to update the client UI.
def can_edit
scope.can_edit?(object.topic)
end
def include_can_review_topic?
scope.can_review_topic?(object.topic)
end
def include_can_move_posts?
scope.can_move_posts?(object.topic)
end
def include_can_delete?
scope.can_delete?(object.topic)
end
def include_can_recover?
scope.can_recover_topic?(object.topic)
end
def include_can_remove_allowed_users?
scope.can_remove_allowed_users?(object.topic)
end
def include_can_invite_to?
scope.can_invite_to?(object.topic)
end
def include_can_invite_via_email?
scope.can_invite_via_email?(object.topic)
end
def include_can_create_post?
scope.can_create?(Post, object.topic)
end
def include_can_reply_as_new_topic?
scope.can_reply_as_new_topic?(object.topic)
end
def include_can_flag_topic?
object.actions_summary.any? { |a| a[:can_act] }
end
def include_can_convert_topic?
scope.can_convert_topic?(object.topic)
end
def include_can_edit_tags?
!scope.can_edit?(object.topic) && scope.can_edit_tags?(object.topic)
end
def include_can_toggle_topic_visibility?
scope.can_toggle_topic_visibility?(object.topic)
end
def can_perform_action_available_to_group_moderators?
@can_perform_action_available_to_group_moderators ||= scope.can_perform_action_available_to_group_moderators?(object.topic)
end
alias :include_can_close_topic? :can_perform_action_available_to_group_moderators?
alias :include_can_archive_topic? :can_perform_action_available_to_group_moderators?
alias :include_can_split_merge_topic? :can_perform_action_available_to_group_moderators?
alias :include_can_edit_staff_notes? :can_perform_action_available_to_group_moderators?
alias :include_can_moderate_category? :can_perform_action_available_to_group_moderators?
def include_can_publish_page?
scope.can_publish_page?(object.topic)
end
def allowed_users
object.topic.allowed_users.reject do |user|
object.group_allowed_user_ids.include?(user.id) && user != scope.user
end
end
def include_allowed_users?
object.personal_message
end
def allowed_groups
object.topic.allowed_groups
end
def include_allowed_groups?
object.personal_message
end
end