Skip to content

Commit 8276be0

Browse files
authored
Redirect normal ID to hashid equivalent (joemasilotti#667)
* update sitemap developer page to use hashid * add en translation for redirection * handle redirect for normal ID on developers show page * update test to redirect to show page with hashid * update sitemap using hashid if Feature is enabled * use shorthand hash value notation * extract developer finder functionality to custom object * use Developers::Finder * remove duplicate test * improve logic of @developer and @reDIrect and test * rename test * use plain assert and refute
1 parent 1c73895 commit 8276be0

File tree

6 files changed

+89
-10
lines changed

6 files changed

+89
-10
lines changed

app/controllers/developers_controller.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,13 @@ def update
4141
end
4242

4343
def show
44-
@developer = find_developer!
44+
finder = Developers::Finder.new(id: params[:id])
45+
@developer = finder.developer
46+
47+
if finder.should_redirect?
48+
redirect_to @developer, status: 302, notice: t(".redirection", url: developer_url(@developer))
49+
end
50+
4551
authorize @developer
4652
end
4753

app/models/developers/finder.rb

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
module Developers
2+
class Finder
3+
NON_ID_PATTERN = /\D+/
4+
5+
def initialize(id:)
6+
@id = id.to_s
7+
@redirect = false
8+
end
9+
10+
def developer
11+
find_developer unless defined?(@developer)
12+
@developer
13+
end
14+
15+
def should_redirect?
16+
find_developer unless defined?(@developer)
17+
@redirect
18+
end
19+
20+
private
21+
22+
def find_by_id!
23+
@developer = Developer.find(@id)
24+
end
25+
26+
def use_hashid?
27+
Feature.enabled?(:obfuscate_developer_urls)
28+
end
29+
30+
def find_developer
31+
if use_hashid?
32+
if NON_ID_PATTERN.match?(@id)
33+
@developer = Developer.find_by_hashid!(@id)
34+
else
35+
find_by_id!
36+
@redirect = true
37+
end
38+
else
39+
find_by_id!
40+
end
41+
end
42+
end
43+
end

config/locales/en.yml

+1
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ en:
393393
edit: Edit
394394
hire: Hire me
395395
message: Message
396+
redirection: Links to developer profiles have changed. Please update your bookmark to %{url}.
396397
update:
397398
updated: Your profile was updated!
398399
dir: ltr

config/sitemap.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
add about_path, changefreq: "monthly", priority: 0.9
2222

2323
Developer.visible.newest_first.find_each do |developer|
24-
add developer_path(id: developer.id), changefreq: "always", priority: 0.8, lastmod: developer.updated_at
24+
id = Feature.enabled?(:obfuscate_developer_urls) ? developer.hashid : developer.id
25+
add developer_path(id:), changefreq: "always", priority: 0.8, lastmod: developer.updated_at
2526
end
2627

2728
add new_user_session_path, changefreq: "weekly", priority: 0.7

test/integration/developers_test.rb

+2-8
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,8 @@ class DevelopersTest < ActionDispatch::IntegrationTest
5757
get developer_path(developer.hashid)
5858
assert_response :ok
5959

60-
assert_raises ActiveRecord::RecordNotFound do
61-
get developer_path(developer.id)
62-
end
63-
64-
sign_in users(:developer)
65-
assert_raises ActiveRecord::RecordNotFound do
66-
get edit_developer_path(developer.id)
67-
end
60+
get developer_path(developer.id)
61+
assert_redirected_to developer_path(developer.hashid)
6862

6963
sign_in users(:developer)
7064
assert_raises ActiveRecord::RecordNotFound do

test/models/developers/finder_test.rb

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
require "test_helper"
2+
3+
class Developers::FinderTest < ActiveSupport::TestCase
4+
setup do
5+
@developer = developers(:one)
6+
end
7+
8+
test "should find a developer by hashid" do
9+
finder = Developers::Finder.new(id: @developer.hashid)
10+
11+
assert_equal finder.developer, @developer
12+
refute finder.should_redirect?
13+
end
14+
15+
test "redirect should be true when given an id" do
16+
finder = Developers::Finder.new(id: @developer.id)
17+
18+
assert finder.should_redirect?
19+
end
20+
21+
test "should find a developer if feature is disabled" do
22+
Feature.stub(:enabled?, false) do
23+
finder = Developers::Finder.new(id: @developer.id)
24+
25+
assert_equal finder.developer, @developer
26+
refute finder.should_redirect?
27+
28+
finder = Developers::Finder.new(id: @developer.hashid)
29+
30+
assert_equal finder.developer, @developer
31+
refute finder.should_redirect?
32+
end
33+
end
34+
end

0 commit comments

Comments
 (0)