discourse/app/models/topic_link_click.rb

59 lines
1.5 KiB
Ruby
Raw Normal View History

2013-02-05 14:16:51 -05: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
validates_presence_of :ip_address
2013-02-05 14:16:51 -05:00
# Create a click from a URL and post_id
def self.create_from(args={})
2013-02-07 10:45:24 -05:00
2013-02-05 14:16:51 -05:00
# Find the forum topic link
2013-07-26 17:29:43 -04:00
link = TopicLink.select([:id, :user_id]).where(url: args[:url])
2013-02-05 14:16:51 -05:00
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 13:18:37 -04:00
# If no link is found, return the url for relative links
unless link.present?
return args[:url] if args[:url] =~ /^\//
return nil
end
2013-07-26 17:29:43 -04:00
return args[:url] if (args[:user_id] && (link.user_id == args[:user_id]))
2013-02-05 14:16:51 -05: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)
create!(topic_link_id: link.id, user_id: args[:user_id], ip_address: args[:ip])
2013-02-05 14:16:51 -05:00
end
args[:url]
end
end
# == Schema Information
#
# Table name: topic_link_clicks
#
# id :integer not null, primary key
# topic_link_id :integer not null
# user_id :integer
# created_at :datetime not null
# updated_at :datetime not null
# ip_address :string not null
#
# Indexes
#
2013-08-27 20:42:58 -04:00
# by_link (topic_link_id)
#