Skip to content

Commit

Permalink
topics search (#1318)
Browse files Browse the repository at this point in the history
  • Loading branch information
morr committed Jun 18, 2017
1 parent 72266be commit 266ffe8
Show file tree
Hide file tree
Showing 12 changed files with 198 additions and 48 deletions.
4 changes: 4 additions & 0 deletions app/assets/javascripts/pages/p-topics/index.js.coffee
@@ -1,7 +1,11 @@
CollectionSearch = require 'views/application/collection_search'

page_load 'topics_index', 'topics_show', 'topics_new', 'topics_edit', 'topics_create', 'topics_update', ->
new Animes.Menu('.b-animes-menu') if $('.b-animes-menu').exists()

page_load 'topics_index', ->
new CollectionSearch '.b-collection_search'

$banner = $('.naruto, .titans')

# скрыть баннер
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/topics_controller.rb
Expand Up @@ -15,6 +15,8 @@ class TopicsController < ShikimoriController
CREATE_PARAMS = UPDATE_PARAMS + %i[user_id forum_id type]

def index
noindex if params[:search].present?

if params[:linked_id]
# редирект на топик, если топик в подфоруме единственный
if @forums_view.topic_views.one?
Expand Down
12 changes: 12 additions & 0 deletions app/query_objects/search/topic.rb
@@ -0,0 +1,12 @@
class Search::Topic < Search::SearchBase
method_object %i[scope phrase forum_id locale ids_limit]

def elastic_results
search_klass.call(
phrase: @phrase,
forum_id: @forum_id,
locale: @locale,
limit: @ids_limit
)
end
end
20 changes: 20 additions & 0 deletions app/query_objects/topics/query.rb
Expand Up @@ -48,6 +48,7 @@ class Topics::Query < QueryObjectBase
) or comments_count != 0
)
SQL
SEARCH_LIMIT = 999

def self.fetch user, locale
query = new Topic
Expand Down Expand Up @@ -84,6 +85,25 @@ def by_linked linked
# end
# end

def search phrase, forum, user, locale
return self if phrase.blank?

forum_id =
if forum
forum.id
else
user.preferences.forums.map(&:to_i) + [Forum::CLUBS_ID]
end

chain Search::Topic.call(
scope: @scope,
phrase: phrase,
forum_id: forum_id,
locale: locale,
ids_limit: SEARCH_LIMIT
)
end

def except_hentai
chain @scope
.joins("left join animes on animes.id=linked_id and linked_type='Anime'")
Expand Down
10 changes: 9 additions & 1 deletion app/services/elasticsearch/query/topic.rb
Expand Up @@ -16,7 +16,15 @@ def locale_query
end

def forum_id_query
{ term: { forum_id: @forum_id } }
if @forum_id.is_a? Array
{
bool: {
should: @forum_id.map { |forum_id| { term: { forum_id: forum_id } } }
}
}
else
{ term: { forum_id: @forum_id } }
end
end

def cache_key
Expand Down
24 changes: 14 additions & 10 deletions app/view_objects/forums/view.rb
Expand Up @@ -21,10 +21,19 @@ def topic_views
Topics::Query.fetch(h.current_user, h.locale_from_host)
.by_forum(forum, h.current_user, h.censored_forbidden?)
.by_linked(linked)
.search(h.params[:search], forum, h.current_user, h.locale_from_host)
.paginate(page, limit)
.as_views(true, forum && forum.permalink == 'reviews')
end

def page_url page
if linked.is_a? Club
club_topics_url page
else
forum_topics_url page
end
end

def next_page_url
page_url topic_views.next_page if topic_views.next_page
end
Expand Down Expand Up @@ -74,24 +83,19 @@ def page

private

def page_url page
if linked.is_a? Club
club_topics_url page
else
forum_topics_url page
end
end

def club_topics_url page
h.club_club_topics_url linked, page: (page unless page == 1)
h.club_club_topics_url linked,
page: (page unless page == 1),
search: h.params[:search]
end

def forum_topics_url page
h.forum_topics_url(
page: (page unless page == 1),
forum: forum.try(:permalink),
linked_id: h.params[:linked_id],
linked_type: h.params[:linked_type]
linked_type: h.params[:linked_type],
search: h.params[:search]
)
end

Expand Down
14 changes: 14 additions & 0 deletions app/views/topics/_collection.html.slim
@@ -0,0 +1,14 @@
- if forums_view.topic_views.any?
= render partial: 'topics/topic',
collection: forums_view.topic_views,
as: :topic_view,
cache: true

- else
.b-nothing_here = t '.no_topics'

- if forums_view.next_page_url
= render 'blocks/postloader',
filter: 'b-topic',
next_url: forums_view.next_page_url,
prev_url: forums_view.prev_page_url
73 changes: 39 additions & 34 deletions app/views/topics/index.html.slim
@@ -1,39 +1,44 @@
- content_for :head do
- if @forums_view.next_page_url
link[
rel="next"
href="#{{@forums_view.next_page_url}}"
]
- if @forums_view.prev_page_url
link[
rel="prev"
href="#{{@forums_view.prev_page_url}}"
]
- if request.xhr?
- if @forums_view.topic_views.none?
.b-nothing_here = t 'nothing_found'
- else
= render 'topics/collection', forums_view: @forums_view

= auto_discovery_link_tag :rss,
forum_topics_url(forum: @forums_view.forum.try(:permalink), format: :rss),
title: 'Site topics'
- else
- content_for :head do
- if @forums_view.next_page_url
link[
rel="next"
href="#{{@forums_view.next_page_url}}"
]
- if @forums_view.prev_page_url
link[
rel="prev"
href="#{{@forums_view.prev_page_url}}"
]

/ - if @forums_view.forum[:id] == 'all'
= auto_discovery_link_tag :rss, 'http://feeds.feedburner.com/shikimori/anime', title: 'Новости аниме'
= auto_discovery_link_tag :rss, 'http://feeds.feedburner.com/shikimori/site', title: 'Новости сайта'
= auto_discovery_link_tag :rss,
forum_topics_url(forum: @forums_view.forum.try(:permalink), format: :rss),
title: 'Site topics'

= render layout: 'topics/page' do |f|
.b-forum.to-process[
data-dynamic='forum'
data-faye="#{@forums_view.faye_subscriptions.to_json}"
]
- if @forums_view.topic_views.any?
= render partial: 'topics/topic',
collection: @forums_view.topic_views,
as: :topic_view,
cache: true
/ - if @forums_view.forum[:id] == 'all'
= auto_discovery_link_tag :rss, 'http://feeds.feedburner.com/shikimori/anime', title: 'Новости аниме'
= auto_discovery_link_tag :rss, 'http://feeds.feedburner.com/shikimori/site', title: 'Новости сайта'
- else
.b-nothing_here = t '.no_topics'
= render layout: 'topics/page' do |f|
.b-collection_search[
data-search_url="#{@forums_view.page_url 1}"
]
.field
input[
type="text"
placeholder="#{t 'search'}"
value="#{params[:search]}"
]
.clear

- if @forums_view.next_page_url
= render 'blocks/postloader',
filter: 'b-topic',
next_url: @forums_view.next_page_url,
prev_url: @forums_view.prev_page_url
.collection.b-forum.to-process[
data-dynamic='forum'
data-faye="#{@forums_view.faye_subscriptions.to_json}"
]
= render 'topics/collection', forums_view: @forums_view
39 changes: 39 additions & 0 deletions spec/query_objects/search/topic_spec.rb
@@ -0,0 +1,39 @@
describe Search::Topic do
subject(:query) do
Search::Topic.call(
scope: scope,
phrase: phrase,
forum_id: forum_id,
locale: locale,
ids_limit: ids_limit
)
end

describe '#call' do
let(:scope) { Topic.all }
let(:phrase) { 'Kaichou' }
let(:forum_id) { 1 }
let(:locale) { 'ru' }
let(:ids_limit) { 10 }

let!(:topic_1) { create :topic }
let!(:topic_2) { create :topic }
let!(:topic_3) { create :topic }

before do
allow(Elasticsearch::Query::Topic).to receive(:call)
.with(
phrase: phrase,
forum_id: forum_id,
locale: locale,
limit: ids_limit
)
.and_return [
{ '_id' => topic_3.id },
{ '_id' => topic_1.id }
]
end

it { is_expected.to eq [topic_3, topic_1] }
end
end
41 changes: 41 additions & 0 deletions spec/query_objects/topics/query_spec.rb
Expand Up @@ -245,6 +245,47 @@
end
end

describe '#search' do
let!(:topic_1) { create :topic, id: 1 }
let!(:topic_2) { create :topic, id: 2 }
let!(:topic_3) { create :topic, id: 3 }
let!(:topic_en) { create :topic, id: 4, locale: :en }

subject { query.search phrase, 'ru' }

context 'present search phrase' do
before do
allow(Elasticsearch::Query::Topic).to receive(:call).with(
phrase: phrase,
locale: 'ru',
limit: Topics::Query::SEARCH_LIMIT
).and_return(
[
{ '_id' => topic_3.id },
{ '_id' => topic_2.id },
{ '_id' => topic_en.id }
]
)
end
let(:phrase) { 'test' }

it do
is_expected.to eq [topic_3, topic_2]
expect(Elasticsearch::Query::Topic).to have_received(:call).once
end
end

context 'missing search phrase' do
before { allow(Elasticsearch::Query::Topic).to receive :call }
let(:phrase) { '' }

it do
is_expected.to have(9).items
expect(Elasticsearch::Query::Topic).to_not have_received :call
end
end
end

describe '#as_views' do
let(:is_preview) { true }
let(:is_mini) { true }
Expand Down
4 changes: 2 additions & 2 deletions spec/vcr_cassettes/Elasticsearch_Query_Topic/_call/1_1_1.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion spec/view_objects/forums/view_spec.rb
Expand Up @@ -52,7 +52,7 @@
end
end

describe '#next_page_url & #prev_page_url' do
describe '#page_url' do
context 'first page' do
let(:params) { { linked_type: anime.class.name, linked_id: anime.id } }
before do
Expand All @@ -63,6 +63,7 @@
end

it do
expect(view.page_url 5).to eq "//test.host/forum/Anime-#{anime.id}/p-5"
expect(view.next_page_url).to eq "//test.host/forum/Anime-#{anime.id}/p-2"
expect(view.current_page_url).to eq "//test.host/forum/Anime-#{anime.id}"
expect(view.prev_page_url).to be_nil
Expand Down

0 comments on commit 266ffe8

Please sign in to comment.