Sha256: 614045b83a59129fdab0a727ff81f82df6ad2d79ba59406a5a33b44ccf9cfc3d

Contents?: true

Size: 1.94 KB

Versions: 1

Compression:

Stored size: 1.94 KB

Contents

require_relative 'campaign'
require_relative 'browser'
require_relative 'serializers/symbol'
require 'addressable/uri'

module Sojourn
  class Request < ActiveRecord::Base
    attr_accessor :user_agent

    serialize :method, Serializers::Symbol
    serialize :params

    belongs_to :campaign, foreign_key: :sojourn_campaign_id
    belongs_to :browser, foreign_key: :sojourn_browser_id
    has_many :events, foreign_key: :sojourn_request_id

    def self.from_request(request)
      new referer: request.referer.try(:truncate, 2048),
          host: request.host.try(:truncate, 2048),
          path: request.path.try(:truncate, 2048),
          controller: request.params[:controller],
          action: request.params[:action],
          params: request.filtered_parameters.with_indifferent_access.except(:controller, :action),
          method: request.request_method_symbol,
          ip_address: request.remote_ip,
          user_agent: request.user_agent
    end

    before_validation do
      self.campaign ||= Campaign.from_request(self)
      self.browser ||= Browser.from_request(self) if user_agent
    end

    def outside_referer?
      referer.present? && Addressable::URI.parse(referer).host != host
    end

    def any_utm_data?
      tracked_param_keys.map { |p| downcased_params[p].present? }.any?
    end

    def tracked_params
      Hash[downcased_params.slice(*tracked_param_keys).delete_if { |_, v| v.blank? }.sort]
    end

    def browser_data
      return @browser_data if @browser_data
      b = browser.try(:send, :browser) || ::Browser.new(user_agent: user_agent)
      @browser_data = {
        name: b.name,
        version: b.version,
        platform: b.platform,
        bot: b.bot?,
        known: b.known?
      }
    end

  private

    def downcased_params
      params.each_with_object({}) { |(k, v), h| h[k.to_s.downcase] = v }
    end

    def tracked_param_keys
      Sojourn.config.campaign_params.map(&:to_s).map(&:downcase)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sojourn-1.0.0.pre lib/sojourn/request.rb