Skip to content

Commit 8113cb4

Browse files
committed
Merge pull request #207 from carlwoodward/288-provider-user-lookup
Fix #288 - add provider user lookup.
2 parents 7105e4f + 0b5e44f commit 8113cb4

File tree

5 files changed

+112
-0
lines changed

5 files changed

+112
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
require Rails.root.join('app/services/provider_user_lookup_service')
2+
3+
class ProviderUserLookupsController < ApplicationController
4+
def show
5+
service = Services::ProviderUserLookupService.new params[:provider], params[:username]
6+
if user = service.lookup_user
7+
redirect_to badge_path(user.username)
8+
else
9+
redirect_to root_path, flash: { notice: 'User not found' }
10+
end
11+
end
12+
end
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
module Services
2+
class ProviderUserLookupService
3+
def initialize(provider, username)
4+
@provider = provider
5+
@username = username
6+
end
7+
8+
def lookup_user
9+
if valid_provider? && valid_username?
10+
User.where(@provider.to_sym => @username).first
11+
else
12+
nil
13+
end
14+
end
15+
16+
private
17+
18+
def valid_provider?
19+
@provider.present? && [:twitter, :github, :linkedin].include?(@provider.to_sym)
20+
end
21+
22+
def valid_username?
23+
@username.present?
24+
end
25+
end
26+
end

config/routes.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@
454454

455455
get '/roll-the-dice' => 'users#randomize', as: :random_wall
456456

457+
get '/providers/:provider/:username' => 'provider_user_lookups#show'
458+
457459

458460
constraints ->(params, _) { params[:username] != 'admin' } do
459461
get '/:username' => 'users#show', as: :badge
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe ProviderUserLookupsController, :type => :controller do
4+
let(:twitter_username) { 'birdy' }
5+
let(:github_username) { 'birdy' }
6+
let(:linked_in_username) { 'birdy' }
7+
let(:attrs) do
8+
{
9+
twitter: twitter_username,
10+
github: github_username,
11+
linkedin: linked_in_username
12+
}
13+
end
14+
let!(:user) {
15+
Fabricate.create(:user, attrs)
16+
}
17+
18+
describe 'GET /providers/:provider/:username' do
19+
describe 'known user' do
20+
it 'redirects to the current user for twitter' do
21+
get :show, provider: 'twitter', username: twitter_username
22+
expect(response).to redirect_to(badge_path(user.username))
23+
end
24+
end
25+
26+
describe 'unknown user' do
27+
it 'redirects to the current user for twitter' do
28+
get :show, provider: 'twitter', username: 'unknown'
29+
expect(response).to redirect_to(root_path)
30+
expect(flash[:notice]).to eql('User not found')
31+
end
32+
end
33+
end
34+
end
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe Services::ProviderUserLookupService do
4+
let(:twitter_username) { 'birdy' }
5+
let!(:user) {
6+
Fabricate.create(:user, twitter: twitter_username)
7+
}
8+
9+
describe '#lookup_user' do
10+
let(:provider) { 'twitter' }
11+
let(:service) { Services::ProviderUserLookupService.new(provider, username) }
12+
13+
describe 'unknown provider' do
14+
let(:provider) { 'unknown' }
15+
let(:username) { 'unknown' }
16+
17+
it 'returns nil' do
18+
expect(service.lookup_user).to be_nil
19+
end
20+
end
21+
22+
describe 'unknown user' do
23+
let(:username) { 'unknown' }
24+
25+
it 'returns nil' do
26+
expect(service.lookup_user).to be_nil
27+
end
28+
end
29+
30+
describe 'known provider and user' do
31+
let(:username) { twitter_username }
32+
33+
it 'returns the user' do
34+
expect(service.lookup_user).to eql(user)
35+
end
36+
end
37+
end
38+
end

0 commit comments

Comments
 (0)