Federated social network node, running on kosmos.social
https://kosmos.social
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.9 KiB
64 lines
1.9 KiB
# 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
|
|
|