Refactor UsersController#create

* Simplify controller action
* Extract service classes
This commit is contained in:
Scott Albertson
2013-11-12 14:37:38 -08:00
parent 13da653f2b
commit 51eff92170
4 changed files with 115 additions and 78 deletions

View File

@@ -0,0 +1,70 @@
class UserActivator
attr_reader :user, :request, :session, :cookies, :message
def initialize(user, request, session, cookies)
@user = user
@session = session
@cookies = cookies
@request = request
@settings = SiteSetting
@hub = DiscourseHub
@message = nil
end
def start
register_nickname
end
def finish
@message = activator.activate
end
private
def activator
factory.new(user, request, session, cookies)
end
def factory
if @settings.must_approve_users?
ApprovalActivator
elsif !user.active?
EmailActivator
else
LoginActivator
end
end
def register_nickname
if user.valid? && @settings.call_discourse_hub?
@hub.register_nickname(user.username, user.email)
end
end
end
class ApprovalActivator < UserActivator
def activate
I18n.t("login.wait_approval")
end
end
class EmailActivator < UserActivator
def activate
Jobs.enqueue(:user_email,
type: :signup,
user_id: user.id,
email_token: user.email_tokens.first.token
)
I18n.t("login.activate_email", email: user.email)
end
end
class LoginActivator < UserActivator
include CurrentUser
def activate
log_on_user(user)
user.enqueue_welcome_message('welcome_user')
I18n.t("login.active")
end
end

View File

@@ -0,0 +1,39 @@
class UserAuthenticator
def initialize(user, session, authenticator_finder = Users::OmniauthCallbacksController)
@user = user
@session = session[:authentication]
@authenticator_finder = authenticator_finder
end
def start
if authenticated?
@user.active = true
else
@user.password_required!
end
end
def finish
if authenticator
authenticator.after_create_account(@user, @session)
end
@session = nil
end
private
def authenticated?
@session && @session[:email] == @user.email && @session[:email_valid]
end
def authenticator
if authenticator_name
@authenticator ||= @authenticator_finder.find_authenticator(authenticator_name)
end
end
def authenticator_name
@session && @session[:authenticator_name]
end
end