Skip to content

Commit

Permalink
Decorate Spree::UsersController when already existing
Browse files Browse the repository at this point in the history
This commit allows to decorate the class `Spree::UsersController`
when already present (ie. when it's already included in the gem
`solidus_frontend`) or to define the class from scratch when it's
not (ie. when using a version of Solidus where `solidus_frontend`
does not include it).

See solidusio/solidus#2695 for the PR that adds the account page
to Solidus Frontend.

Once all supported versions of Solidus include the account page,
we will be able to get rid of the class definition, together with
the ERB view at `lib/views/frontend/spree/users/show.html.erb`.
  • Loading branch information
spaghetticode committed Jan 8, 2021
1 parent 1e4dc48 commit 22a99a3
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 62 deletions.
62 changes: 0 additions & 62 deletions lib/controllers/frontend/spree/users_controller.rb

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# frozen_string_literal: true

module Spree
module UsersControllerDecorator
def self.prepended(base)
base.prepend_before_action :authorize_actions, only: :new
base.prepend_before_action :load_object, only: [:show, :edit, :update]
end

def create
@user = Spree::User.new(user_params)
if @user.save

if current_order
session[:guest_token] = nil
end

redirect_back_or_default(root_url)
else
render :new
end
end

def update
if @user.update(user_params)
spree_current_user.reload

if params[:user][:password].present?
# this logic needed b/c devise wants to log us out after password changes
unless Spree::Auth::Config[:signout_after_password_change]
bypass_sign_in(@user)
end
end
redirect_to spree.account_url, notice: I18n.t('spree.account_updated')
else
render :edit
end
end

private

def user_params
params.require(:user).permit(Spree::PermittedAttributes.user_attributes | [:email])
end

def authorize_actions
authorize! params[:action].to_sym, Spree::User.new
end

# When using a version of Solidus that includes the account page, we just need to
# decorate the existing controller with further behavior from this extension.
#
# On the other hand, when using a version of Solidus that does not include the
# account page, we need to define the controller from scratch.
#
# Once we drop the support for all Solidus versions that don't include the
# account page, we can just leave the decorator and remove anything else, including
# the view file at `lib/views/frontend/spree/users/show.html.erb`.
if defined?(Spree::UsersController)
Spree::UsersController.prepend(self)
else
class Spree::UsersController < Spree::StoreController
skip_before_action :set_current_order, only: :show, raise: false
prepend_before_action :load_object, only: [:show, :edit, :update]
prepend_before_action :authorize_actions, only: :new

include Spree::Core::ControllerHelpers

def show
@orders = @user.orders.complete.order('completed_at desc')
end

def create
@user = Spree::User.new(user_params)
if @user.save

if current_order
session[:guest_token] = nil
end

redirect_back_or_default(root_url)
else
render :new
end
end

def update
if @user.update(user_params)
spree_current_user.reload

if params[:user][:password].present?
# this logic needed b/c devise wants to log us out after password changes
unless Spree::Auth::Config[:signout_after_password_change]
bypass_sign_in(@user)
end
end
redirect_to spree.account_url, notice: I18n.t('spree.account_updated')
else
render :edit
end
end

private

def user_params
params.require(:user).permit(Spree::PermittedAttributes.user_attributes | [:email])
end

def load_object
@user ||= Spree::User.find_by(id: spree_current_user&.id)
authorize! params[:action].to_sym, @user
end

def authorize_actions
authorize! params[:action].to_sym, Spree::User.new
end

def accurate_title
I18n.t('spree.my_account')
end
end
end
end
end

0 comments on commit 22a99a3

Please sign in to comment.