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
|