mirror of
https://github.com/mastodon/mastodon.git
synced 2024-10-21 00:56:14 +00:00
087ed84367
* Optimize map { ... }.compact using Enumerable#filter_map, supported since Ruby 2.7 * Add poyfill for Enumerable#filter_map
65 lines
1.9 KiB
Ruby
65 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
# == Schema Information
|
|
#
|
|
# Table name: custom_filters
|
|
#
|
|
# id :bigint(8) not null, primary key
|
|
# account_id :bigint(8)
|
|
# expires_at :datetime
|
|
# phrase :text default(""), not null
|
|
# context :string default([]), not null, is an Array
|
|
# whole_word :boolean default(TRUE), not null
|
|
# irreversible :boolean default(FALSE), not null
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
#
|
|
|
|
class CustomFilter < ApplicationRecord
|
|
VALID_CONTEXTS = %w(
|
|
home
|
|
notifications
|
|
public
|
|
thread
|
|
account
|
|
).freeze
|
|
|
|
include Expireable
|
|
|
|
belongs_to :account
|
|
|
|
validates :phrase, :context, presence: true
|
|
validate :context_must_be_valid
|
|
validate :irreversible_must_be_within_context
|
|
|
|
scope :active_irreversible, -> { where(irreversible: true).where(Arel.sql('expires_at IS NULL OR expires_at > NOW()')) }
|
|
|
|
before_validation :clean_up_contexts
|
|
after_commit :remove_cache
|
|
|
|
def expires_in
|
|
return @expires_in if defined?(@expires_in)
|
|
return nil if expires_at.nil?
|
|
|
|
[30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].find { |expires_in| expires_in.from_now >= expires_at }
|
|
end
|
|
|
|
private
|
|
|
|
def clean_up_contexts
|
|
self.context = Array(context).map(&:strip).filter_map(&:presence)
|
|
end
|
|
|
|
def remove_cache
|
|
Rails.cache.delete("filters:#{account_id}")
|
|
Redis.current.publish("timeline:#{account_id}", Oj.dump(event: :filters_changed))
|
|
end
|
|
|
|
def context_must_be_valid
|
|
errors.add(:context, I18n.t('filters.errors.invalid_context')) if context.empty? || context.any? { |c| !VALID_CONTEXTS.include?(c) }
|
|
end
|
|
|
|
def irreversible_must_be_within_context
|
|
errors.add(:irreversible, I18n.t('filters.errors.invalid_irreversible')) if irreversible? && !context.include?('home') && !context.include?('notifications')
|
|
end
|
|
end
|