Skip to content

Commit 84782f9

Browse files
authored
Merge pull request #19 from a-chacon/18-add-referrer-information
feat: add referer to visits model
2 parents 0c27b50 + a2759c4 commit 84782f9

File tree

5 files changed

+56
-47
lines changed

5 files changed

+56
-47
lines changed

Gemfile.lock

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,15 @@ GEM
8181
tzinfo (~> 2.0, >= 2.0.5)
8282
addressable (2.8.7)
8383
public_suffix (>= 2.0.2, < 7.0)
84-
ast (2.4.2)
84+
ast (2.4.3)
8585
base64 (0.2.0)
8686
benchmark (0.4.0)
8787
bigdecimal (3.1.9)
8888
browser (6.2.0)
8989
builder (3.3.0)
90-
byebug (11.1.3)
90+
byebug (12.0.0)
9191
concurrent-ruby (1.3.5)
92-
connection_pool (2.5.0)
92+
connection_pool (2.5.3)
9393
crack (1.0.0)
9494
bigdecimal
9595
rexml
@@ -100,7 +100,7 @@ GEM
100100
erubi (1.13.1)
101101
faker (3.5.1)
102102
i18n (>= 1.8.11, < 2)
103-
ffi (1.17.1-x86_64-linux-gnu)
103+
ffi (1.17.2-x86_64-linux-gnu)
104104
ffi-compiler (1.3.2)
105105
ffi (>= 1.15.5)
106106
rake
@@ -119,17 +119,17 @@ GEM
119119
i18n (1.14.7)
120120
concurrent-ruby (~> 1.0)
121121
io-console (0.8.0)
122-
irb (1.15.1)
122+
irb (1.15.2)
123123
pp (>= 0.6.0)
124124
rdoc (>= 4.0.0)
125125
reline (>= 0.4.2)
126-
json (2.10.2)
126+
json (2.11.3)
127127
language_server-protocol (3.17.0.4)
128128
lint_roller (1.1.0)
129129
llhttp-ffi (0.5.1)
130130
ffi-compiler (~> 1.0)
131131
rake (~> 13.0)
132-
logger (1.6.6)
132+
logger (1.7.0)
133133
loofah (2.24.0)
134134
crass (~> 1.0.2)
135135
nokogiri (>= 1.12.0)
@@ -142,7 +142,7 @@ GEM
142142
mini_mime (1.1.5)
143143
minitest (5.25.5)
144144
minitest-cc (1.0.0)
145-
net-imap (0.5.6)
145+
net-imap (0.5.8)
146146
date
147147
net-protocol
148148
net-pop (0.1.2)
@@ -152,22 +152,23 @@ GEM
152152
net-smtp (0.5.1)
153153
net-protocol
154154
nio4r (2.7.4)
155-
nokogiri (1.18.4-x86_64-linux-gnu)
155+
nokogiri (1.18.8-x86_64-linux-gnu)
156156
racc (~> 1.4)
157-
parallel (1.26.3)
158-
parser (3.3.7.1)
157+
parallel (1.27.0)
158+
parser (3.3.8.0)
159159
ast (~> 2.4.1)
160160
racc
161161
pp (0.6.2)
162162
prettyprint
163163
prettyprint (0.2.0)
164-
psych (5.2.3)
164+
prism (1.4.0)
165+
psych (5.2.4)
165166
date
166167
stringio
167-
public_suffix (6.0.1)
168+
public_suffix (6.0.2)
168169
racc (1.8.1)
169-
rack (3.1.12)
170-
rack-session (2.1.0)
170+
rack (3.1.14)
171+
rack-session (2.1.1)
171172
base64 (>= 0.1.0)
172173
rack (>= 3.0.0)
173174
rack-test (2.2.0)
@@ -205,36 +206,38 @@ GEM
205206
zeitwerk (~> 2.6)
206207
rainbow (3.1.1)
207208
rake (13.2.1)
208-
rdoc (6.12.0)
209+
rdoc (6.13.1)
209210
psych (>= 4.0.0)
210211
regexp_parser (2.10.0)
211-
reline (0.6.0)
212+
reline (0.6.1)
212213
io-console (~> 0.5)
213214
rexml (3.4.1)
214-
rubocop (1.74.0)
215+
rubocop (1.75.5)
215216
json (~> 2.3)
216217
language_server-protocol (~> 3.17.0.2)
217218
lint_roller (~> 1.1.0)
218219
parallel (~> 1.10)
219220
parser (>= 3.3.0.2)
220221
rainbow (>= 2.2.2, < 4.0)
221222
regexp_parser (>= 2.9.3, < 3.0)
222-
rubocop-ast (>= 1.38.0, < 2.0)
223+
rubocop-ast (>= 1.44.0, < 2.0)
223224
ruby-progressbar (~> 1.7)
224225
unicode-display_width (>= 2.4.0, < 4.0)
225-
rubocop-ast (1.39.0)
226-
parser (>= 3.3.1.0)
226+
rubocop-ast (1.44.1)
227+
parser (>= 3.3.7.2)
228+
prism (~> 1.4)
227229
ruby-progressbar (1.13.0)
228230
securerandom (0.4.1)
229-
sprockets (4.2.1)
231+
sprockets (4.2.2)
230232
concurrent-ruby (~> 1.0)
233+
logger
231234
rack (>= 2.2.4, < 4)
232235
sprockets-rails (3.5.2)
233236
actionpack (>= 6.1)
234237
activesupport (>= 6.1)
235238
sprockets (>= 3.0.0)
236239
sqlite3 (2.6.0-x86_64-linux-gnu)
237-
stringio (3.1.5)
240+
stringio (3.1.7)
238241
thor (1.3.2)
239242
timeout (0.4.3)
240243
tzinfo (2.0.6)

app/models/rails_url_shortener/visit.rb

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,27 @@ class Visit < ApplicationRecord
3333
# Parse a request information and save
3434
#
3535
# Return boolean
36-
36+
# rubocop:disable Metrics/AbcSize
3737
def self.parse_and_save(url, request)
38-
# browser detection
3938
browser(request)
40-
if !RailsUrlShortener.save_bots_visits && @browser.bot?
41-
false
42-
else
43-
# save
44-
visit = Visit.create(
45-
url: url,
46-
ip: request.ip,
47-
browser: @browser.name,
48-
browser_version: @browser.full_version,
49-
platform: @browser.platform.name,
50-
platform_version: @browser.platform.version,
51-
bot: @browser.bot?,
52-
user_agent: request.headers['User-Agent']
53-
)
54-
# We enqueue a job for get more data later
55-
IpCrawlerJob.perform_later(visit)
56-
visit
57-
end
39+
return false if !RailsUrlShortener.save_bots_visits && @browser.bot?
40+
41+
visit = Visit.create(
42+
url: url,
43+
ip: request.ip,
44+
browser: @browser.name,
45+
browser_version: @browser.full_version,
46+
platform: @browser.platform.name,
47+
platform_version: @browser.platform.version,
48+
bot: @browser.bot?,
49+
user_agent: request.headers['User-Agent'],
50+
referer: request.headers['Referer']
51+
)
52+
53+
IpCrawlerJob.perform_later(visit)
54+
visit
5855
end
56+
# rubocop:enable Metrics/AbcSize
5957

6058
def self.browser(request)
6159
@browser = Browser.new(request.headers['User-Agent'])
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddRefererToVistis < ActiveRecord::Migration[7.0]
2+
def change
3+
add_column :rails_url_shortener_visits, :referer, :string, default: ""
4+
end
5+
end

test/dummy/db/schema.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema[7.0].define(version: 2022_04_18_184647) do
13+
ActiveRecord::Schema[7.0].define(version: 2025_05_08_120951) do
1414
create_table "rails_url_shortener_ipgeos", force: :cascade do |t|
1515
t.string "ip"
1616
t.string "country"
@@ -56,6 +56,7 @@
5656
t.datetime "created_at", null: false
5757
t.datetime "updated_at", null: false
5858
t.integer "ipgeo_id"
59+
t.string "referer", default: ""
5960
t.index ["ipgeo_id"], name: "index_rails_url_shortener_visits_on_ipgeo_id"
6061
t.index ["url_id"], name: "index_rails_url_shortener_visits_on_url_id"
6162
end
@@ -66,5 +67,4 @@
6667
t.datetime "created_at", null: false
6768
t.datetime "updated_at", null: false
6869
end
69-
7070
end

test/models/rails_url_shortener/visit_test.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ class VisitTest < ActiveSupport::TestCase
3434
url: rails_url_shortener_urls(:one),
3535
ip: '192.168.8.1',
3636
user_agent: 'Mozilla/5.0 (X11; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0',
37-
meta: 'Mozilla/5.0 (X11; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0'
37+
meta: 'Mozilla/5.0 (X11; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0',
38+
referer: 'https://example.com'
3839
)
3940
assert visit.save
4041
assert_equal visit.url, rails_url_shortener_urls(:one)
@@ -43,7 +44,8 @@ class VisitTest < ActiveSupport::TestCase
4344
test 'parse and save' do
4445
# generate a fake request
4546
request = ActionDispatch::TestRequest.create(env = Rack::MockRequest.env_for('/', 'HTTP_HOST' => 'test.host'.b,
46-
'REMOTE_ADDR' => '1.0.0.0'.b, 'HTTP_USER_AGENT' => 'Rails Testing'.b))
47+
'REMOTE_ADDR' => '1.0.0.0'.b, 'HTTP_USER_AGENT' => 'Rails Testing'.b,
48+
'HTTP_REFERER' => 'https://example.com'.b))
4749
request.user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1 Safari/605.1.15'
4850
# implement the method
4951
visit = nil
@@ -58,6 +60,7 @@ class VisitTest < ActiveSupport::TestCase
5860
assert visit.browser_version, Browser.new(request.user_agent).full_version
5961
assert visit.platform, Browser.new(request.user_agent).platform.name
6062
assert visit.platform_version, Browser.new(request.user_agent).platform.version
63+
assert visit.referer, request.headers['Referer']
6164
end
6265

6366
test "don't save bots" do

0 commit comments

Comments
 (0)