diff --git a/app/queries/projects/list_query.rb b/app/queries/projects/list_query.rb index 1994c9c7..140d973e 100644 --- a/app/queries/projects/list_query.rb +++ b/app/queries/projects/list_query.rb @@ -25,7 +25,7 @@ class Projects::ListQuery < ApplicationQuery def filter_projects(collection) # collection = by_pinned(collection) - collection = by_search(collection) + collection = by_search(collection) if params[:search].present? collection = by_project_type(collection) collection = by_project_category(collection) collection = by_project_language(collection) @@ -33,7 +33,12 @@ class Projects::ListQuery < ApplicationQuery end def by_search(items) - items.visible.by_name_or_identifier(params[:search]) + ids = Projects::ElasticsearchService.call(params[:search]) + if ids.present? + items.visible.where(id: ids) + else + items.visible.by_name_or_identifier(params[:search]) + end end def by_project_type(items) diff --git a/app/services/projects/elasticsearch_service.rb b/app/services/projects/elasticsearch_service.rb new file mode 100644 index 00000000..466e17ff --- /dev/null +++ b/app/services/projects/elasticsearch_service.rb @@ -0,0 +1,20 @@ +class Projects::ElasticsearchService < ApplicationService + attr_reader :keyword + + def initialize(keyword) + @keyword = keyword + end + + def call + domain = EduSetting.get("search_api_url") || "https://statistics.gitlink.org.cn" + api_url = "#{domain}/search?page=1&size=1000&term=#{@keyword}&type=1" + response = Faraday.get(api_url) + result = JSON.parse(response&.body) + project_ids = result[:data][:rows].map{|d|d[:instanceId]} + project_ids + rescue => e + puts "ElasticsearchService error: #{e.message}" + raise Error, e.message + end + +end