diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d89d7b6..f263abaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## HEAD * Add facebook user_info_path option to initializer.rb [#63](https://github.com/Sorcery/sorcery/pull/63) +* Add new function: `build_from` (allows building a user instance from OAuth without saving) [#54](https://github.com/Sorcery/sorcery/pull/54) ## 0.11.0 diff --git a/lib/sorcery/controller/submodules/external.rb b/lib/sorcery/controller/submodules/external.rb index 72ec2678..fcff2d30 100644 --- a/lib/sorcery/controller/submodules/external.rb +++ b/lib/sorcery/controller/submodules/external.rb @@ -187,6 +187,15 @@ def create_from(provider_name, &block) @user = user_class.create_from_provider(provider_name, @user_hash[:uid], attrs, &block) end + # follows the same patterns as create_from, but builds the user instead of creating + def build_from(provider_name, &block) + sorcery_fetch_user_hash provider_name + config = user_class.sorcery_config + + attrs = user_attrs(@provider.user_info_mapping, @user_hash) + @user = user_class.build_from_provider(attrs, &block) + end + def user_attrs(user_info_mapping, user_hash) attrs = {} user_info_mapping.each do |k, v| diff --git a/lib/sorcery/model/submodules/external.rb b/lib/sorcery/model/submodules/external.rb index 2f2babfd..3a84c23b 100644 --- a/lib/sorcery/model/submodules/external.rb +++ b/lib/sorcery/model/submodules/external.rb @@ -73,6 +73,21 @@ def create_from_provider(provider, uid, attrs) end user end + + # NOTE: Should this build the authentication as well and return [user, auth]? + # Currently, users call this function for the user and call add_provider_to_user after saving + def build_from_provider(attrs) + user = new + attrs.each do |k, v| + user.send(:"#{k}=", v) + end + + if block_given? + return false unless yield user + end + + user + end end module InstanceMethods