1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- # frozen_string_literal: true
- class StatusesSearchService < BaseService
- def call(query, account = nil, options = {})
- @query = query&.strip
- @account = account
- @options = options
- @limit = options[:limit].to_i
- @offset = options[:offset].to_i
- convert_deprecated_options!
- status_search_results
- end
- private
- def status_search_results
- request = parsed_query.request
- results = request.collapse(field: :id).order(id: { order: :desc }).limit(@limit).offset(@offset).objects.compact
- account_ids = results.map(&:account_id)
- account_domains = results.map(&:account_domain)
- preloaded_relations = @account.relations_map(account_ids, account_domains)
- results.reject { |status| StatusFilter.new(status, @account, preloaded_relations).filtered? }
- rescue Faraday::ConnectionFailed, Parslet::ParseFailed
- []
- end
- def parsed_query
- SearchQueryTransformer.new.apply(SearchQueryParser.new.parse(@query), current_account: @account)
- end
- def convert_deprecated_options!
- syntax_options = []
- if @options[:account_id]
- username = Account.select(:username, :domain).find(@options[:account_id]).acct
- syntax_options << "from:@#{username}"
- end
- if @options[:min_id]
- timestamp = Mastodon::Snowflake.to_time(@options[:min_id].to_i)
- syntax_options << "after:\"#{timestamp.iso8601}\""
- end
- if @options[:max_id]
- timestamp = Mastodon::Snowflake.to_time(@options[:max_id].to_i)
- syntax_options << "before:\"#{timestamp.iso8601}\""
- end
- @query = "#{@query} #{syntax_options.join(' ')}".strip if syntax_options.any?
- end
- end
|