require_dependency 'enum' class SearchLog < ActiveRecord::Base validates_presence_of :term, :ip_address def self.search_types @search_types ||= Enum.new( header: 1, full_page: 2 ) end def self.log(term:, search_type:, ip_address:, user_id: nil) search_type = search_types[search_type] return [:error] unless search_type.present? && ip_address.present? update_sql = <<~SQL UPDATE search_logs SET term = :term, created_at = :created_at WHERE created_at > :timeframe AND position(term IN :term) = 1 AND ((:user_id IS NULL AND ip_address = :ip_address) OR (user_id = :user_id)) RETURNING id SQL rows = exec_sql( update_sql, term: term, created_at: Time.zone.now, timeframe: 5.seconds.ago, user_id: user_id, ip_address: ip_address ) if rows.cmd_tuples == 0 result = create( term: term, search_type: search_type, ip_address: ip_address, user_id: user_id ) [:created, result.id] else [:updated, rows[0]['id'].to_i] end end def self.clean_up search_id = SearchLog.order(:id).offset(SiteSetting.search_query_log_max_size).limit(1).pluck(:id) if search_id.present? SearchLog.where('id < ?', search_id[0]).delete_all end end end # == Schema Information # # Table name: search_logs # # id :integer not null, primary key # term :string not null # user_id :integer # ip_address :inet not null # clicked_topic_id :integer # search_type :integer not null # created_at :datetime not null #