Welcome to mirror list, hosted at ThFree Co, Russian Federation.

set_namespace_commit_email_service.rb « users « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 30ee597120deed40149ada7dbabeaba166132066 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# frozen_string_literal: true

module Users
  class SetNamespaceCommitEmailService
    include Gitlab::Allowable

    attr_reader :current_user, :target_user, :namespace, :email_id

    def initialize(current_user, namespace, email_id, params)
      @current_user = current_user
      @target_user = params.delete(:user) || current_user
      @namespace = namespace
      @email_id = email_id
    end

    def execute
      return error(_('Namespace must be provided.')) if namespace.nil?

      unless can?(current_user, :admin_user_email_address, target_user)
        return error(_("User doesn't exist or you don't have permission to change namespace commit emails."))
      end

      unless can?(target_user, :read_namespace, namespace)
        return error(_("Namespace doesn't exist or you don't have permission."))
      end

      email = target_user.emails.find_by(id: email_id) unless email_id.nil? # rubocop: disable CodeReuse/ActiveRecord
      existing_namespace_commit_email = target_user.namespace_commit_email_for_namespace(namespace)
      if existing_namespace_commit_email.nil?
        return error(_('Email must be provided.')) if email.nil?

        create_namespace_commit_email(email)
      elsif email_id.nil?
        remove_namespace_commit_email(existing_namespace_commit_email)
      else
        update_namespace_commit_email(existing_namespace_commit_email, email)
      end
    end

    private

    def remove_namespace_commit_email(namespace_commit_email)
      namespace_commit_email.destroy
      success(nil)
    end

    def create_namespace_commit_email(email)
      namespace_commit_email = ::Users::NamespaceCommitEmail.new(
        user: target_user,
        namespace: namespace,
        email: email
      )

      save_namespace_commit_email(namespace_commit_email)
    end

    def update_namespace_commit_email(namespace_commit_email, email)
      namespace_commit_email.email = email

      save_namespace_commit_email(namespace_commit_email)
    end

    def save_namespace_commit_email(namespace_commit_email)
      if !namespace_commit_email.save
        error_in_save(namespace_commit_email)
      else
        success(namespace_commit_email)
      end
    end

    def success(namespace_commit_email)
      ServiceResponse.success(payload: {
        namespace_commit_email: namespace_commit_email
      })
    end

    def error(message)
      ServiceResponse.error(message: message)
    end

    def error_in_save(namespace_commit_email)
      return error(_('Failed to save namespace commit email.')) if namespace_commit_email.errors.empty?

      error(namespace_commit_email.errors.full_messages.to_sentence)
    end
  end
end