Apply filters to poll options (#11174)
* Apply filters to poll options in WebUI Fixes #11128 * Apply filters to poll options server-side * Add poll options to searchable text
This commit is contained in:
		
							parent
							
								
									66ac1bd063
								
							
						
					
					
						commit
						47ef4a6c7a
					
				
					 4 changed files with 12 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -51,7 +51,7 @@ class StatusesIndex < Chewy::Index
 | 
			
		|||
      field :id, type: 'long'
 | 
			
		||||
      field :account_id, type: 'long'
 | 
			
		||||
 | 
			
		||||
      field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).join("\n\n") } do
 | 
			
		||||
      field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).concat(status.preloadable_poll ? status_preloadable_poll.options : []).join("\n\n") } do
 | 
			
		||||
        field :stemmed, type: 'text', analyzer: 'content'
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,7 +56,7 @@ export function normalizeStatus(status, normalOldStatus) {
 | 
			
		|||
    normalStatus.hidden = normalOldStatus.get('hidden');
 | 
			
		||||
  } else {
 | 
			
		||||
    const spoilerText   = normalStatus.spoiler_text || '';
 | 
			
		||||
    const searchContent = [spoilerText, status.content].join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
 | 
			
		||||
    const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
 | 
			
		||||
    const emojiMap      = makeEmojiMap(normalStatus);
 | 
			
		||||
 | 
			
		||||
    normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -220,7 +220,8 @@ class FeedManager
 | 
			
		|||
    status         = status.reblog if status.reblog?
 | 
			
		||||
 | 
			
		||||
    !combined_regex.match(Formatter.instance.plaintext(status)).nil? ||
 | 
			
		||||
      (status.spoiler_text.present? && !combined_regex.match(status.spoiler_text).nil?)
 | 
			
		||||
      (status.spoiler_text.present? && !combined_regex.match(status.spoiler_text).nil?) ||
 | 
			
		||||
      (status.preloadable_poll && !combined_regex.match(status.preloadable_poll.options.join("\n\n")).nil?)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Adds a status to an account's feed, returning true if a status was
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -149,6 +149,14 @@ RSpec.describe FeedManager do
 | 
			
		|||
          status = Fabricate(:status, text: 'shiitake', account: jeff)
 | 
			
		||||
          expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'returns true if phrase is contained in a poll option' do
 | 
			
		||||
          alice.custom_filters.create!(phrase: 'farts', context: %w(home public), irreversible: true)
 | 
			
		||||
          alice.custom_filters.create!(phrase: 'pop tarts', context: %w(home), irreversible: true)
 | 
			
		||||
          alice.follow!(jeff)
 | 
			
		||||
          status = Fabricate(:status, text: 'what do you prefer', poll: Fabricate(:poll, options: %w(farts POP TARts)), account: jeff)
 | 
			
		||||
          expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue