diff options
Diffstat (limited to 'app/models/integrations/emails_on_push.rb')
-rw-r--r-- | app/models/integrations/emails_on_push.rb | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/app/models/integrations/emails_on_push.rb b/app/models/integrations/emails_on_push.rb new file mode 100644 index 00000000000..e277633664f --- /dev/null +++ b/app/models/integrations/emails_on_push.rb @@ -0,0 +1,99 @@ +# frozen_string_literal: true + +module Integrations + class EmailsOnPush < Integration + include NotificationBranchSelection + + RECIPIENTS_LIMIT = 750 + + boolean_accessor :send_from_committer_email + boolean_accessor :disable_diffs + prop_accessor :recipients, :branches_to_be_notified + validates :recipients, presence: true, if: :validate_recipients? + validate :number_of_recipients_within_limit, if: :validate_recipients? + + def self.valid_recipients(recipients) + recipients.split.select do |recipient| + recipient.include?('@') + end.uniq(&:downcase) + end + + def title + s_('EmailsOnPushService|Emails on push') + end + + def description + s_('EmailsOnPushService|Email the commits and diff of each push to a list of recipients.') + end + + def self.to_param + 'emails_on_push' + end + + def self.supported_events + %w(push tag_push) + end + + def initialize_properties + super + + self.branches_to_be_notified = 'all' if branches_to_be_notified.nil? + end + + def execute(push_data) + return unless supported_events.include?(push_data[:object_kind]) + return if project.emails_disabled? + return unless notify_for_ref?(push_data) + + EmailsOnPushWorker.perform_async( + project_id, + recipients, + push_data, + send_from_committer_email: send_from_committer_email?, + disable_diffs: disable_diffs? + ) + end + + def notify_for_ref?(push_data) + return true if push_data[:object_kind] == 'tag_push' + return true if push_data.dig(:object_attributes, :tag) + + notify_for_branch?(push_data) + end + + def send_from_committer_email? + Gitlab::Utils.to_boolean(self.send_from_committer_email) + end + + def disable_diffs? + Gitlab::Utils.to_boolean(self.disable_diffs) + end + + def fields + domains = Notify.allowed_email_domains.map { |domain| "user@#{domain}" }.join(", ") + [ + { type: 'checkbox', name: 'send_from_committer_email', title: s_("EmailsOnPushService|Send from committer"), + help: s_("EmailsOnPushService|Send notifications from the committer's email address if the domain matches the domain used by your GitLab instance (such as %{domains}).") % { domains: domains } }, + { type: 'checkbox', name: 'disable_diffs', title: s_("EmailsOnPushService|Disable code diffs"), + help: s_("EmailsOnPushService|Don't include possibly sensitive code diffs in notification body.") }, + { type: 'select', name: 'branches_to_be_notified', choices: branch_choices }, + { + type: 'textarea', + name: 'recipients', + placeholder: s_('EmailsOnPushService|tanuki@example.com gitlab@example.com'), + help: s_('EmailsOnPushService|Emails separated by whitespace.') + } + ] + end + + private + + def number_of_recipients_within_limit + return if recipients.blank? + + if self.class.valid_recipients(recipients).size > RECIPIENTS_LIMIT + errors.add(:recipients, s_("EmailsOnPushService|can't exceed %{recipients_limit}") % { recipients_limit: RECIPIENTS_LIMIT }) + end + end + end +end |