-
-
Notifications
You must be signed in to change notification settings - Fork 124
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Decorate
Spree::UsersController
when already existing
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
1 parent
1e4dc48
commit 22a99a3
Showing
2 changed files
with
124 additions
and
62 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
124 changes: 124 additions & 0 deletions
124
lib/decorators/frontend/controllers/spree/users_controller_decorator.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |