Railsのモデル部分のロジックを今度はservice層に移した

この前のブログでモデルのビジネスロジック層を分ける記事書きましたが、あれから色々見て改めて考えた。
で結論service層を設けてユーザ登録部分を移した。

 1 class  UserRegister
  2
  3   def find_user_by_provider_and_uid
  4     @auth_provider = AuthProvider.where(provider: @auth[:provider]).where(uid: @auth[:uid]).first
  5     @user = User.where(user_id: @auth_provider.user_id) if @auth_provider
  6     nil unless @auth_provider
  7   end
  8
  9   def create_account(auth)
 10     nil
 11   end
 12 end
  1 class UserRegisterFactory
  2   def self.create_user_register(auth)
  3     if auth[:provider]  == 'facebook'
  4       @user = FacebookUserRegister.new(auth)
  5     elsif auth[:provider] == 'twitter'
  6       @user = TwitterUserRegister.new(auth)
  7     elsif auth[:provider] == 'developer'
  8       @user = DeveloperUserRegister.new(auth)
  9     end
 10     @user
 11   end
 12
 13 end
  1 class DeveloperUserRegister < UserRegister
  2
  3   def initialize(auth)
  4     @auth = auth
  5   end
  6
  7   def create_account
  8     @new_user = User.find_or_create_by(email: @auth[:info][:email])  do|user|
  9       user.name  = "developer"
 10       user.email = @auth[:info][:email]
 11     end
 12     @auth_provider =  AuthProvider.find_or_create_by(provider: @auth[:provider], user_id: @new_user.id) do |auth_pro|
 13       auth_pro.user_id = @new_user.id
 14       auth_pro.uid      = @auth[:uid]
 15       auth_pro.provider = @auth[:provider]
 16       unless @auth[:info].blank?
 17         auth_pro.screen_name = "dev dev"
 18         auth_pro.image_path  = @auth[:info][:image]
 19       end
 20       auth_pro.token = @auth["credentials"]["token"] unless @auth["credentials"].blank?
 21     end
 22     @new_user.login_provider =  @auth_provider
 23     @new_user
 24   end
 25 end

テストコードの一部

  1 require 'spec_helper'
  2
  3 describe UserRegister do
  4   fixtures :users
  5   fixtures :auth_providers
  6
  7   describe "create_account method test" do
  8     context "first login by omniauth normal test" do
  9       before do
 10         auth  = { provider: 'twitter',  uid:  'aabbbcc11111', extra: { raw_info: { email: 'test2@gmail.com', name: 'test test', nickname: 'test test' } } }
 11         @service = UserRegisterFactory.create_user_register(auth)
 12         @user = @service.create_account
 13       end
 14       #  subject { @user }
 15       #  expectが使えない
 16       it "login success?" do
 17         expect(@user).not_to be_nil
 18       end
 19
 20       it "test attribute check" do
 21         provider = @user.login_provider
 22         expect(@user.login_provider).not_to be_nil
 23         expect(provider.provider).to eql('twitter')
 24         expect(provider.uid).to eql('aabbbcc11111')
 25         expect(@user.email).to eql('test2@gmail.com')
 26 
 27       end
 28     end
 29    end
 30 end

コードが整理された感じがする。よし、再度コード見直してリファクタしよう。
もっと勉強だ!!