rokumatsumoto/boyutluseyler

View on GitHub
app/models/ahoy/event.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

# == Schema Information
#
# Table name: ahoy_events
#
#  id         :bigint(8)        not null, primary key
#  visit_id   :bigint(8)
#  user_id    :bigint(8)
#  name       :string
#  properties :jsonb
#  time       :datetime
#

module Ahoy
  class Event < ApplicationRecord
    include Ahoy::QueryMethods

    self.table_name = 'ahoy_events'

    VIEWED_DESIGN = 'Viewed design'
    LIKED_DESIGN = 'Liked design'
    DOWNLOADED_DESIGN = 'Downloaded design'

    USER_EVENTS = [LIKED_DESIGN, DOWNLOADED_DESIGN].freeze

    belongs_to :visit
    belongs_to :user, optional: true
    belongs_to :design, class_name: 'Design', store: :properties, optional: true

    counter_culture :user,
                    column_name: proc { |e| user_event?(e.name) ? 'events_count' : nil },
                    touch: 'updated_at'
    counter_culture :design,
                    column_name: proc { |e| download_event?(e.name) ? 'downloads_count' : nil }
    counter_culture :design,
                    column_name: proc { |e| like_event?(e.name) ? 'likes_count' : nil }

    class << self
      def cached_any_events_for?(event_name, user, event_properties)
        _event_fk, event_id = event_properties.first # key, value = hash.first

        cache_name = "any_events_for-#{event_name.parameterize.underscore}-#{event_id}-#{user.updated_at}"
        Rails.cache.fetch(cache_name, expires_in: 1.week) do
          Ahoy::Event.where(name: event_name, properties: event_properties, user_id: user.id).any?
        end
      end

      private

      def user_event?(event_name)
        USER_EVENTS.include? event_name
      end

      def download_event?(event_name)
        event_name == DOWNLOADED_DESIGN
      end

      def like_event?(event_name)
        event_name == LIKED_DESIGN
      end
    end
  end
end