rubygems/rubygems.org

View on GitHub
app/models/events/recordable.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Events::Recordable
  extend ActiveSupport::Concern

  def record_event!(tag, request: Current.request, **additional)
    ip_address = request&.ip_address
    geoip_info = ip_address&.geoip_info

    if (user_agent = request&.user_agent.presence)
      begin
        user_agent_info = Gemcutter::UserAgentParser.call(user_agent)
        additional[:user_agent_info] = user_agent_info
      rescue Gemcutter::UserAgentParser::UnableToParse
        nil
      end
    end

    event = events.create!(tag:, ip_address:, geoip_info:, additional:, trace_id: Datadog::Tracing.correlation.trace_id)
    logger.info("Recorded event #{tag}", record: cache_key,
      event: event.as_json, tag:, ip_address: ip_address.as_json, additional: event.additional)
    event
  end

  included do
    has_many :events, class_name: "Events::#{name}Event", dependent: :destroy, inverse_of: model_name.param_key
  end
end