discourse/app/serializers/group_show_serializer.rb
Martin Brennan 48d13cb231
UX: Use a dropdown for SSL mode for group SMTP (#27932)
Our old group SMTP SSL option was a checkbox,
but this was not ideal because there are actually
3 different ways SSL can be used when sending
SMTP:

* None
* SSL/TLS
* STARTTLS

We got around this before with specific overrides
for Gmail, but it's not flexible enough and now people
want to use other providers. It's best to be clear,
though it is a technical detail. We provide a way
to test the SMTP settings before saving them so there
should be little chance of messing this up.

This commit also converts GroupEmailSettings to a glimmer
component.
2024-07-18 10:33:14 +10:00

173 lines
4.4 KiB
Ruby

# frozen_string_literal: true
class GroupShowSerializer < BasicGroupSerializer
attributes :is_group_user,
:is_group_owner,
:is_group_owner_display,
:mentionable,
:messageable,
:flair_icon,
:flair_type
def self.admin_attributes(*attrs)
attributes(*attrs)
attrs.each do |attr|
define_method "include_#{attr}?" do
scope.is_admin?
end
end
end
has_one :smtp_updated_by, embed: :object, serializer: BasicUserSerializer
has_one :imap_updated_by, embed: :object, serializer: BasicUserSerializer
admin_attributes :automatic_membership_email_domains,
:smtp_server,
:smtp_port,
:smtp_ssl_mode,
:smtp_enabled,
:smtp_updated_at,
:smtp_updated_by,
:imap_server,
:imap_port,
:imap_ssl,
:imap_mailbox_name,
:imap_mailboxes,
:imap_enabled,
:imap_updated_at,
:imap_updated_by,
:email_username,
:email_password,
:email_from_alias,
:imap_last_error,
:imap_old_emails,
:imap_new_emails,
:message_count,
:allow_unknown_sender_topic_replies,
:associated_group_ids
def self.admin_or_owner_attributes(*attrs)
attributes(*attrs)
attrs.each do |attr|
define_method "include_#{attr}?" do
scope.is_admin? || (include_is_group_owner? && is_group_owner)
end
end
end
admin_or_owner_attributes :watching_category_ids,
:tracking_category_ids,
:watching_first_post_category_ids,
:regular_category_ids,
:muted_category_ids,
:watching_tags,
:watching_first_post_tags,
:tracking_tags,
:regular_tags,
:muted_tags
def include_is_group_user?
authenticated?
end
def is_group_user
!!fetch_group_user
end
def include_is_group_owner?
authenticated? && fetch_group_user&.owner
end
def is_group_owner
true
end
def include_is_group_owner_display?
authenticated?
end
def is_group_owner_display
!!fetch_group_user&.owner
end
def include_mentionable?
authenticated?
end
def include_messageable?
authenticated?
end
def mentionable
Group.mentionable(scope.user).exists?(id: object.id)
end
def messageable
scope.can_send_private_message?(object)
end
def include_flair_icon?
flair_icon.present? && (is_group_owner || scope.is_admin?)
end
def include_flair_type?
flair_type.present? && (is_group_owner || scope.is_admin?)
end
%i[watching regular tracking watching_first_post muted].each do |level|
define_method("#{level}_category_ids") do
group_category_notifications[NotificationLevels.all[level]] || []
end
define_method("include_#{level}_tags?") do
SiteSetting.tagging_enabled? && scope.is_admin? || (include_is_group_owner? && is_group_owner)
end
define_method("#{level}_tags") { group_tag_notifications[NotificationLevels.all[level]] || [] }
end
def associated_group_ids
object.associated_groups.map(&:id)
end
def include_associated_group_ids?
scope.can_associate_groups?
end
private
def authenticated?
scope.authenticated?
end
def fetch_group_user
return @group_user if defined?(@group_user)
@group_user = object.group_users.find_by(user: scope.user)
end
def group_category_notifications
@group_category_notification_defaults ||=
GroupCategoryNotificationDefault
.where(group_id: object.id)
.pluck(:notification_level, :category_id)
.inject({}) do |h, arr|
h[arr[0]] ||= []
h[arr[0]] << arr[1]
h
end
end
def group_tag_notifications
@group_tag_notification_defaults ||=
GroupTagNotificationDefault
.where(group_id: object.id)
.joins(:tag)
.pluck(:notification_level, :name)
.inject({}) do |h, arr|
h[arr[0]] ||= []
h[arr[0]] << arr[1]
h
end
end
end