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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/audit_events/build_service.rb')
-rw-r--r--app/services/audit_events/build_service.rb87
1 files changed, 87 insertions, 0 deletions
diff --git a/app/services/audit_events/build_service.rb b/app/services/audit_events/build_service.rb
new file mode 100644
index 00000000000..f5322fa5ff4
--- /dev/null
+++ b/app/services/audit_events/build_service.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+module AuditEvents
+ class BuildService
+ # Handle missing attributes
+ MissingAttributeError = Class.new(StandardError)
+
+ # @raise [MissingAttributeError] when required attributes are blank
+ #
+ # @return [BuildService]
+ def initialize(
+ author:, scope:, target:, message:,
+ created_at: DateTime.current, additional_details: {}, ip_address: nil, target_details: nil)
+ raise MissingAttributeError if missing_attribute?(author, scope, target, message)
+
+ @author = build_author(author)
+ @scope = scope
+ @target = build_target(target)
+ @ip_address = ip_address || build_ip_address
+ @message = build_message(message)
+ @created_at = created_at
+ @additional_details = additional_details
+ @target_details = target_details
+ end
+
+ # Create an instance of AuditEvent
+ #
+ # @return [AuditEvent]
+ def execute
+ AuditEvent.new(payload)
+ end
+
+ private
+
+ def missing_attribute?(author, scope, target, message)
+ author.blank? || scope.blank? || target.blank? || message.blank?
+ end
+
+ def payload
+ base_payload.merge(details: base_details_payload)
+ end
+
+ def base_payload
+ {
+ author_id: @author.id,
+ author_name: @author.name,
+ entity_id: @scope.id,
+ entity_type: @scope.class.name,
+ created_at: @created_at
+ }
+ end
+
+ def base_details_payload
+ @additional_details.merge({
+ author_name: @author.name,
+ author_class: @author.class.name,
+ target_id: @target.id,
+ target_type: @target.type,
+ target_details: @target_details || @target.details,
+ custom_message: @message
+ })
+ end
+
+ def build_author(author)
+ author.id = -2 if author.instance_of? DeployToken
+ author.id = -3 if author.instance_of? DeployKey
+
+ author
+ end
+
+ def build_target(target)
+ return target if target.is_a? ::Gitlab::Audit::NullTarget
+
+ ::Gitlab::Audit::Target.new(target)
+ end
+
+ def build_message(message)
+ message
+ end
+
+ def build_ip_address
+ Gitlab::RequestContext.instance.client_ip || @author.current_sign_in_ip
+ end
+ end
+end
+
+AuditEvents::BuildService.prepend_mod_with('AuditEvents::BuildService')