gitlab-org--gitlab-foss/app/services/audit_events/build_service.rb

88 lines
2.4 KiB
Ruby

# 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')