discourse/app/models/screened_url.rb

58 lines
1.6 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
# A ScreenedUrl record represents a URL that is being watched.
# If the URL is found in a post, some action can be performed.
# For now, nothing is done. We're just collecting the data and will decide
# what to do with it later.
class ScreenedUrl < ActiveRecord::Base
include ScreeningModel
default_action :do_nothing
before_validation :normalize
validates :url, presence: true, uniqueness: true
validates :domain, presence: true
def normalize
self.url = ScreenedUrl.normalize_url(self.url) if self.url
self.domain = self.domain.downcase.sub(/\Awww\./, "") if self.domain
end
2017-07-27 20:20:09 -05:00
def self.watch(url, domain, opts = {})
find_match(url) || create(opts.slice(:action_type, :ip_address).merge(url: url, domain: domain))
end
def self.find_match(url)
find_by_url normalize_url(url)
end
def self.normalize_url(url)
normalized = url.gsub(%r{http(s?)://}i, "")
normalized.gsub!(%r{(/)+\z}, "") # trim trailing slashes
normalized.gsub!(%r{\A([^/]+)(?:/)?}) { |m| m.downcase } # downcase the domain part of the url
normalized
end
end
2013-08-27 19:42:58 -05:00
# == Schema Information
#
# Table name: screened_urls
#
# id :integer not null, primary key
2019-01-11 13:29:56 -06:00
# url :string not null
# domain :string not null
2013-08-27 19:42:58 -05:00
# action_type :integer not null
# match_count :integer default(0), not null
# last_match_at :datetime
# created_at :datetime not null
# updated_at :datetime not null
2013-12-05 00:40:35 -06:00
# ip_address :inet
2013-08-27 19:42:58 -05:00
#
# Indexes
#
# index_screened_urls_on_last_match_at (last_match_at)
# index_screened_urls_on_url (url) UNIQUE
#