Include the `search_log_id` in search results

This commit is contained in:
Robin Ward 2017-07-17 11:57:13 -04:00
parent d0c5205a52
commit 21e02d6969
7 changed files with 74 additions and 8 deletions

View File

@ -12,6 +12,9 @@ class SearchLog < ActiveRecord::Base
def self.log(term:, search_type:, ip_address:, user_id:nil) 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_sql = <<~SQL
UPDATE search_logs UPDATE search_logs
SET term = :term, SET term = :term,
@ -35,7 +38,7 @@ class SearchLog < ActiveRecord::Base
if rows.cmd_tuples == 0 if rows.cmd_tuples == 0
result = create( result = create(
term: term, term: term,
search_type: search_types[search_type], search_type: search_type,
ip_address: ip_address, ip_address: ip_address,
user_id: user_id user_id: user_id
) )

View File

@ -2,5 +2,10 @@ class GroupedSearchResultSerializer < ApplicationSerializer
has_many :posts, serializer: SearchPostSerializer has_many :posts, serializer: SearchPostSerializer
has_many :users, serializer: SearchResultUserSerializer has_many :users, serializer: SearchResultUserSerializer
has_many :categories, serializer: BasicCategorySerializer has_many :categories, serializer: BasicCategorySerializer
attributes :more_posts, :more_users, :more_categories, :term attributes :more_posts, :more_users, :more_categories, :term, :search_log_id
def search_log_id
object.search_log_id
end
end end

View File

@ -182,7 +182,13 @@ class Search
@limit = Search.per_filter @limit = Search.per_filter
end end
@results = GroupedSearchResults.new(@opts[:type_filter], clean_term, @search_context, @include_blurbs, @blurb_length) @results = GroupedSearchResults.new(
@opts[:type_filter],
clean_term,
@search_context,
@include_blurbs,
@blurb_length
)
end end
def valid? def valid?
@ -197,12 +203,13 @@ class Search
def execute def execute
if SiteSetting.log_search_queries? if SiteSetting.log_search_queries?
SearchLog.log( status, search_log_id = SearchLog.log(
term: @term, term: @term,
search_type: @opts[:search_type], search_type: @opts[:search_type],
ip_address: @opts[:ip_address], ip_address: @opts[:ip_address],
user_id: @opts[:user_id] user_id: @opts[:user_id]
) )
@results.search_log_id = search_log_id unless status == :error
end end
unless @filters.present? unless @filters.present?

View File

@ -9,10 +9,20 @@ class Search
extend ActionView::Helpers::TextHelper extend ActionView::Helpers::TextHelper
end end
attr_reader :type_filter, attr_reader(
:posts, :categories, :users, :type_filter,
:more_posts, :more_categories, :more_users, :posts,
:term, :search_context, :include_blurbs :categories,
:users,
:more_posts,
:more_categories,
:more_users,
:term,
:search_context,
:include_blurbs
)
attr_accessor :search_log_id
def initialize(type_filter, term, search_context, include_blurbs, blurb_length) def initialize(type_filter, term, search_context, include_blurbs, blurb_length)
@type_filter = type_filter @type_filter = type_filter

View File

@ -790,4 +790,16 @@ describe Search do
end end
end end
context "search_log_id" do
it "returns an id when the search succeeds" do
s = Search.new(
'indiana jones',
search_type: :header,
ip_address: '127.0.0.1'
)
results = s.execute
expect(results.search_log_id).to be_present
end
end
end end

View File

@ -57,8 +57,17 @@ describe SearchController do
it "logs the search term" do it "logs the search term" do
SiteSetting.log_search_queries = true SiteSetting.log_search_queries = true
xhr :get, :query, term: 'wookie' xhr :get, :query, term: 'wookie'
expect(response).to be_success expect(response).to be_success
expect(SearchLog.where(term: 'wookie')).to be_present expect(SearchLog.where(term: 'wookie')).to be_present
json = JSON.parse(response.body)
search_log_id = json['grouped_search_result']['search_log_id']
expect(search_log_id).to be_present
log = SearchLog.where(id: search_log_id).first
expect(log).to be_present
expect(log.term).to eq('wookie')
end end
it "doesn't log when disabled" do it "doesn't log when disabled" do

View File

@ -4,6 +4,26 @@ RSpec.describe SearchLog, type: :model do
describe ".log" do describe ".log" do
context "invalid arguments" do
it "no search type returns error" do
status, _ = SearchLog.log(
term: 'bounty hunter',
search_type: :missing,
ip_address: '127.0.0.1'
)
expect(status).to eq(:error)
end
it "no IP returns error" do
status, _ = SearchLog.log(
term: 'bounty hunter',
search_type: :header,
ip_address: nil
)
expect(status).to eq(:error)
end
end
context "when anonymous" do context "when anonymous" do
it "logs and updates the search" do it "logs and updates the search" do
Timecop.freeze do Timecop.freeze do