mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
Refactor UsersController#create
* Simplify controller action * Extract service classes
This commit is contained in:
70
app/services/user_activator.rb
Normal file
70
app/services/user_activator.rb
Normal 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
|
||||
39
app/services/user_authenticator.rb
Normal file
39
app/services/user_authenticator.rb
Normal 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
|
||||
Reference in New Issue
Block a user