Commit 2533959664d54a205e8e5872846fdabaa5bee92b
1 parent
7826b2f7
Gerenates user image acording to provider
Signed-off-by: Gabriel Silva <gabriel93.silva@gmail.com> Signed-off-by: Sabryna Sousa <sabryna.sousa1323@gmail.com>
Showing
6 changed files
with
101 additions
and
9 deletions
Show diff stats
plugins/oauth_client/controllers/public/oauth_client_plugin_public_controller.rb
... | ... | @@ -30,18 +30,20 @@ class OauthClientPluginPublicController < PublicController |
30 | 30 | provider = OauthClientPlugin::Provider.find(session[:provider_id]) |
31 | 31 | |
32 | 32 | if provider.enabled? |
33 | - user = User.new | |
34 | - user.email = auth.info.email | |
35 | - user.login = auth.info.name.to_slug | |
36 | - | |
33 | + user = User.new(email: auth.info.email, login: auth.info.name.to_slug) | |
37 | 34 | webfinger = OpenStruct.new( |
38 | 35 | identifier: user.login, |
39 | 36 | name: auth.info.name, |
40 | 37 | created_at: Time.now, |
41 | 38 | domain: auth.provider, |
42 | 39 | email: user.email) |
43 | - user.external_person_id = ExternalPerson.get_or_create(webfinger).id | |
44 | - user.store_oauth_providers | |
40 | + person = ExternalPerson.get_or_create(webfinger) | |
41 | + user.external_person_id = person.id | |
42 | + | |
43 | + if person.oauth_auth.nil? | |
44 | + OauthClientPlugin::Auth.create_for_strategy(provider.strategy, external_person: person, | |
45 | + provider: provider, uid: auth.uid, enabled: true) | |
46 | + end | |
45 | 47 | self.current_user = user |
46 | 48 | else |
47 | 49 | session[:notice] = _("Can't login with %s") % provider.name | ... | ... |
plugins/oauth_client/db/migrate/20160720165808_add_external_profile_to_oauth_auth.rb
0 → 100644
... | ... | @@ -0,0 +1,13 @@ |
1 | +class AddExternalProfileToOauthAuth < ActiveRecord::Migration | |
2 | + def up | |
3 | + add_column :oauth_client_plugin_auths, :external_person_id, :integer | |
4 | + add_column :oauth_client_plugin_auths, :uid, :string | |
5 | + add_index :oauth_client_plugin_auths, :external_person_id | |
6 | + end | |
7 | + | |
8 | + def down | |
9 | + remove_index :oauth_client_plugin_auths, :external_person_id | |
10 | + remove_column :oauth_client_plugin_auths, :external_person_id | |
11 | + remove_column :oauth_client_plugin_auths, :uid | |
12 | + end | |
13 | +end | ... | ... |
... | ... | @@ -0,0 +1,26 @@ |
1 | +require_dependency 'external_person' | |
2 | + | |
3 | +class ExternalPerson | |
4 | + | |
5 | + has_one :oauth_auth, foreign_key: :external_person_id, class_name: 'OauthClientPlugin::Auth', dependent: :destroy | |
6 | + has_one :oauth_provider, through: :oauth_auth, source: :provider | |
7 | + | |
8 | + def avatar | |
9 | + self.oauth_auth.image_url | |
10 | + end | |
11 | + | |
12 | + def image | |
13 | + ExternalPerson::Image.new(oauth_auth) | |
14 | + end | |
15 | + | |
16 | + class ExternalPerson::Image | |
17 | + def initialize(oauth_auth) | |
18 | + @oauth_auth = oauth_auth | |
19 | + end | |
20 | + | |
21 | + def public_filename(size = nil) | |
22 | + URI(@oauth_auth.image_url(size)) | |
23 | + end | |
24 | + end | |
25 | + | |
26 | +end | ... | ... |
plugins/oauth_client/models/oauth_client_plugin/auth.rb
1 | 1 | class OauthClientPlugin::Auth < ApplicationRecord |
2 | 2 | |
3 | - attr_accessible :profile, :provider, :enabled, | |
4 | - :access_token, :expires_in | |
3 | + attr_accessible :profile, :external_person, :provider, | |
4 | + :enabled, :access_token, :expires_in, :type, :uid | |
5 | 5 | |
6 | 6 | belongs_to :profile, class_name: 'Profile' |
7 | + belongs_to :external_person, class_name: 'ExternalPerson' | |
7 | 8 | belongs_to :provider, class_name: 'OauthClientPlugin::Provider' |
8 | 9 | |
9 | - validates_presence_of :profile | |
10 | 10 | validates_presence_of :provider |
11 | 11 | validates_uniqueness_of :profile_id, scope: :provider_id |
12 | + validates_uniqueness_of :external_person_id, scope: :provider_id | |
13 | + | |
14 | + validate :must_be_related_to_profile | |
12 | 15 | |
13 | 16 | acts_as_having_settings field: :data |
14 | 17 | |
... | ... | @@ -26,4 +29,21 @@ class OauthClientPlugin::Auth < ApplicationRecord |
26 | 29 | not self.expired? |
27 | 30 | end |
28 | 31 | |
32 | + def self.create_for_strategy(strategy, args = {}) | |
33 | + namespace = self.name.split("::")[0] | |
34 | + class_name = "#{namespace}::#{strategy.camelize}Auth" | |
35 | + OauthClientPlugin::Auth.create!(args.merge(type: class_name)) | |
36 | + end | |
37 | + | |
38 | + def must_be_related_to_profile | |
39 | + if self.profile.nil? && self.external_person.nil? | |
40 | + self.errors.add(:base, "Must ") | |
41 | + end | |
42 | + end | |
43 | + | |
44 | + # Should be implemented by the Provider specific Auth classes | |
45 | + def image_url(size = nil) | |
46 | + nil | |
47 | + end | |
48 | + | |
29 | 49 | end | ... | ... |
plugins/oauth_client/models/oauth_client_plugin/facebook_auth.rb
0 → 100644
... | ... | @@ -0,0 +1,16 @@ |
1 | +class OauthClientPlugin::FacebookAuth < OauthClientPlugin::Auth | |
2 | + | |
3 | + IMAGE_SIZES = { | |
4 | + :big => "150", | |
5 | + :thumb => "100", | |
6 | + :portrait => "64", | |
7 | + :minor => "50", | |
8 | + :icon => "20" | |
9 | + } | |
10 | + | |
11 | + def image_url(size = nil) | |
12 | + size = "" | |
13 | + "http://graph.facebook.com/#{self.uid}/picture" | |
14 | + end | |
15 | + | |
16 | +end | ... | ... |
plugins/oauth_client/models/oauth_client_plugin/github_auth.rb
0 → 100644
... | ... | @@ -0,0 +1,15 @@ |
1 | +class OauthClientPlugin::GithubAuth < OauthClientPlugin::Auth | |
2 | + | |
3 | + IMAGE_SIZE = { | |
4 | + :big => "150", | |
5 | + :thumb => "100", | |
6 | + :portrait => "64", | |
7 | + :minor => "50", | |
8 | + :icon => "18" | |
9 | + } | |
10 | + | |
11 | + def image_url(size = nil) | |
12 | + size = IMAGE_SIZES[size] || IMAGE_SIZES[:icon] | |
13 | + "https://avatars.githubusercontent.com/u/#{self.uid}?v=3&size=#{size}" | |
14 | + end | |
15 | +end | ... | ... |