2013-02-05 13:16:51 -06:00
|
|
|
require_dependency 'discourse'
|
|
|
|
require 'ipaddr'
|
|
|
|
|
|
|
|
class TopicLinkClick < ActiveRecord::Base
|
|
|
|
belongs_to :topic_link, counter_cache: :clicks
|
|
|
|
belongs_to :user
|
|
|
|
|
|
|
|
validates_presence_of :topic_link_id
|
2013-06-24 17:30:32 -05:00
|
|
|
validates_presence_of :ip_address
|
2013-02-05 13:16:51 -06:00
|
|
|
|
|
|
|
# Create a click from a URL and post_id
|
|
|
|
def self.create_from(args={})
|
2013-02-07 09:45:24 -06:00
|
|
|
|
2014-01-14 13:59:51 -06:00
|
|
|
# If the URL is absolute, allow HTTPS and HTTP versions of it
|
|
|
|
if args[:url] =~ /^http/
|
|
|
|
http_url = args[:url].sub(/^https/, 'http')
|
2014-03-10 10:16:21 -05:00
|
|
|
https_url = args[:url].sub(/^http\:/, 'https:')
|
2014-01-14 13:59:51 -06:00
|
|
|
link = TopicLink.select([:id, :user_id]).where('url = ? OR url = ?', http_url, https_url)
|
|
|
|
else
|
|
|
|
link = TopicLink.select([:id, :user_id]).where(url: args[:url])
|
|
|
|
end
|
|
|
|
|
2013-02-05 13:16:51 -06:00
|
|
|
# Find the forum topic link
|
|
|
|
link = link.where(post_id: args[:post_id]) if args[:post_id].present?
|
|
|
|
|
|
|
|
# If we don't have a post, just find the first occurance of the link
|
|
|
|
link = link.where(topic_id: args[:topic_id]) if args[:topic_id].present?
|
|
|
|
link = link.first
|
|
|
|
|
2013-07-27 12:18:37 -05:00
|
|
|
# If no link is found, return the url for relative links
|
|
|
|
unless link.present?
|
|
|
|
return args[:url] if args[:url] =~ /^\//
|
2013-11-29 13:29:28 -06:00
|
|
|
|
2014-11-20 13:01:48 -06:00
|
|
|
begin
|
|
|
|
uri = URI.parse(args[:url])
|
|
|
|
return args[:url] if uri.host == URI.parse(Discourse.base_url).host
|
|
|
|
rescue
|
|
|
|
end
|
|
|
|
|
2013-11-29 13:29:28 -06:00
|
|
|
# If we have it somewhere else on the site, just allow the redirect. This is
|
|
|
|
# likely due to a onebox of another topic.
|
2014-05-06 08:41:59 -05:00
|
|
|
link = TopicLink.find_by(url: args[:url])
|
2013-11-29 13:29:28 -06:00
|
|
|
return link.present? ? link.url : nil
|
2013-07-27 12:18:37 -05:00
|
|
|
end
|
|
|
|
|
2013-07-26 16:29:43 -05:00
|
|
|
return args[:url] if (args[:user_id] && (link.user_id == args[:user_id]))
|
|
|
|
|
2013-02-05 13:16:51 -06:00
|
|
|
# Rate limit the click counts to once in 24 hours
|
|
|
|
rate_key = "link-clicks:#{link.id}:#{args[:user_id] || args[:ip]}"
|
|
|
|
if $redis.setnx(rate_key, "1")
|
|
|
|
$redis.expire(rate_key, 1.day.to_i)
|
2013-06-24 17:30:32 -05:00
|
|
|
create!(topic_link_id: link.id, user_id: args[:user_id], ip_address: args[:ip])
|
2013-02-05 13:16:51 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
args[:url]
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
2013-05-23 21:48:32 -05:00
|
|
|
|
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: topic_link_clicks
|
|
|
|
#
|
|
|
|
# id :integer not null, primary key
|
|
|
|
# topic_link_id :integer not null
|
|
|
|
# user_id :integer
|
2014-08-27 00:19:25 -05:00
|
|
|
# created_at :datetime not null
|
|
|
|
# updated_at :datetime not null
|
2013-12-05 00:40:35 -06:00
|
|
|
# ip_address :inet not null
|
2013-05-23 21:48:32 -05:00
|
|
|
#
|
|
|
|
# Indexes
|
|
|
|
#
|
2014-05-27 20:49:50 -05:00
|
|
|
# by_link (topic_link_id)
|
2013-05-23 21:48:32 -05:00
|
|
|
#
|