trakio/trakio-ruby

View on GitHub
lib/trakio_client/identify.rb

Summary

Maintainability
A
55 mins
Test Coverage
module TrakioClient
  class Identify < EndPoint

    def run p = {}
      properties = p[:properties] || {}
      distinct_id = p[:distinct_id] || self.distinct_id
      company_id = p[:company_id] || self.company_id
      check_parameters distinct_id, properties
      properties = process_companies company_id, properties

      params = {
        distinct_id: distinct_id,
        properties: properties
      }

      send_request 'identify', params
    end

    def process_companies company_id, properties

      # String company should be moved to company_name
      if properties[:company].is_a? String
        properties[:company_name] = properties.delete :company
      end

      # Company must be an array
      [:company, :companies].each do |x|
        properties[x] ||= []
        unless properties[x].is_a?(Array)
          properties[x] = [properties[x]]
        end
      end

      # Merge companies and company
      properties[:company] += properties.delete(:companies) || []

      check_companies properties[:company]

      # Inject current company
      if company_id && properties[:company].none?{ |x| x[:company_id] == company_id }
        properties[:company] << { company_id: company_id }
      end

      # Clean up company
      properties.delete(:company) if properties[:company].empty?

      properties
    end

    def check_parameters distinct_id, properties
      unless properties.is_a?(Hash)
        raise Exceptions::InvalidParameter.new("The `properties` parameter must be a hash.")
      end
      unless distinct_id
        raise Exceptions::MissingParameter.new('The `distinct_id` parameter must be provided.')
      end
    end

    def check_companies companies
      unless companies.all?{ |x| x.is_a?(Hash) } && companies.all?{ |x| x.include? :company_id }
        raise Exceptions::InvalidProperty.new('The `companies` property must be an array of hashes each with a value for `company_id`')
      end
    end

  end
end