8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# File 'app/models/user_profile_view.rb', line 8
def self.add(user_profile_id, ip, user_id = nil, at = nil, skip_redis = false)
at ||= Time.zone.now
redis_key = +"user-profile-view:#{user_profile_id}:#{at.to_date}"
if user_id
return if user_id < 1
redis_key << ":user-#{user_id}"
ip = nil
else
redis_key << ":ip-#{ip}"
end
if skip_redis || Discourse.redis.setnx(redis_key, "1")
skip_redis ||
Discourse.redis.expire(redis_key, SiteSetting.user_profile_view_duration_hours.hours)
self.transaction do
sql =
"INSERT INTO user_profile_views (user_profile_id, ip_address, viewed_at, user_id)
SELECT :user_profile_id, :ip_address, :viewed_at, :user_id
WHERE NOT EXISTS (
SELECT 1 FROM user_profile_views
/*where*/
)"
builder = DB.build(sql)
if !user_id
builder.where(
"viewed_at = :viewed_at AND ip_address = :ip_address AND user_profile_id = :user_profile_id AND user_id IS NULL",
)
else
builder.where(
"viewed_at = :viewed_at AND user_id = :user_id AND user_profile_id = :user_profile_id",
)
end
result =
builder.exec(
user_profile_id: user_profile_id,
ip_address: ip,
viewed_at: at,
user_id: user_id,
)
UserProfile.find(user_profile_id).increment!(:views) if result > 0
end
end
end
|