spree_auth_devise 4.1.1 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of spree_auth_devise might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.travis.yml +29 -23
- data/Appraisals +1 -1
- data/Gemfile +1 -1
- data/Rakefile +9 -3
- data/app/controllers/spree/api/v2/storefront/account_confirmations_controller.rb +20 -0
- data/app/controllers/spree/api/v2/storefront/passwords_controller.rb +35 -0
- data/app/controllers/spree/user_passwords_controller.rb +1 -1
- data/app/mailers/spree/user_mailer.rb +6 -2
- data/app/models/spree/user.rb +17 -0
- data/app/services/spree/account/create.rb +19 -0
- data/app/services/spree/account/update.rb +17 -0
- data/app/views/spree/user_mailer/confirmation_instructions.text.erb +3 -3
- data/app/views/spree/user_mailer/reset_password_instructions.text.erb +2 -7
- data/config/locales/de.yml +18 -0
- data/config/locales/en.yml +7 -2
- data/config/locales/zh-TW.yml +60 -0
- data/config/routes.rb +10 -0
- data/gemfiles/spree_4_1.gemfile +1 -1
- data/lib/controllers/api/spree/api/v2/storefront/account_controller_decorator.rb +41 -0
- data/lib/controllers/frontend/spree/users_controller.rb +1 -6
- data/lib/spree/auth/engine.rb +14 -1
- data/spec/controllers/spree/api/v2/storefront/passwords_controller_spec.rb +63 -0
- data/spec/features/admin/sign_in_spec.rb +8 -2
- data/spec/features/checkout_spec.rb +1 -1
- data/spec/features/sign_in_spec.rb +13 -7
- data/spec/features/sign_out_spec.rb +1 -3
- data/spec/mailers/user_mailer_spec.rb +2 -2
- data/spec/models/user_spec.rb +4 -2
- data/spec/requests/spree/api/v2/storefront/account_confirmation_spec.rb +48 -0
- data/spec/requests/spree/api/v2/storefront/account_spec.rb +101 -0
- data/spec/spec_helper.rb +7 -38
- data/spree_auth_devise.gemspec +3 -25
- metadata +20 -344
- data/spec/requests/spree/frontend/user_update_spec.rb +0 -42
- data/spec/support/add_to_cart.rb +0 -22
- data/spec/support/authentication_helpers.rb +0 -14
- data/spec/support/cache_helpers.rb +0 -5
- data/spec/support/capybara.rb +0 -23
- data/spec/support/database_cleaner.rb +0 -17
- data/spec/support/factory_girl.rb +0 -5
- data/spec/support/spree.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 118d51e3f609cac9bc6a69453d96893824814d99a44e8be828741ebd410c9aa9
|
4
|
+
data.tar.gz: dcb44d6ef585b73b82665d12b04821e5f9d6393ef87626cbbd4091e060390365
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e3de0c4e4fd5adf202a9fa312f6025eaef63d9b61c8024703b418dc911d9dab405c76d3c25c6ed3f7e7d84f1bb867c2874a21e08dad903618c8632cf087531a
|
7
|
+
data.tar.gz: d650a6a697c44abba86562a2bc94b98ba117ce74a4a57f614f6e210690ea4f44f8e21f64aaf8a55458b8323b0e8686a48f3b313453337635aae8ffd2fe944dc3
|
data/.travis.yml
CHANGED
@@ -1,38 +1,44 @@
|
|
1
|
-
|
2
|
-
dist:
|
3
|
-
|
4
|
-
script:
|
5
|
-
- bundle exec rake test_app
|
6
|
-
- bundle exec rake spec
|
1
|
+
os: linux
|
2
|
+
dist: bionic
|
7
3
|
|
8
4
|
addons:
|
9
|
-
|
10
|
-
|
5
|
+
apt:
|
6
|
+
sources:
|
7
|
+
- google-chrome
|
8
|
+
packages:
|
9
|
+
- google-chrome-stable
|
11
10
|
|
12
|
-
|
13
|
-
-
|
14
|
-
-
|
11
|
+
services:
|
12
|
+
- mysql
|
13
|
+
- postgresql
|
15
14
|
|
16
15
|
language: ruby
|
17
16
|
|
18
17
|
rvm:
|
19
|
-
- 2.5
|
20
|
-
|
18
|
+
- 2.5
|
19
|
+
- 2.6
|
20
|
+
|
21
|
+
env:
|
22
|
+
- DB=mysql
|
23
|
+
- DB=postgres
|
21
24
|
|
22
25
|
gemfile:
|
23
26
|
- gemfiles/spree_4_1.gemfile
|
24
27
|
- gemfiles/spree_master.gemfile
|
25
28
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
+
jobs:
|
30
|
+
allow_failures:
|
31
|
+
- gemfile: gemfiles/spree_master.gemfile
|
29
32
|
|
30
33
|
before_install:
|
31
|
-
- gem update bundler
|
32
34
|
- mysql -u root -e "GRANT ALL ON *.* TO 'travis'@'%';"
|
33
|
-
|
34
|
-
|
35
|
-
-
|
36
|
-
-
|
37
|
-
-
|
38
|
-
-
|
35
|
+
|
36
|
+
before_script:
|
37
|
+
- CHROME_MAIN_VERSION=`google-chrome-stable --version | sed -E 's/(^Google Chrome |\.[0-9]+ )//g'`
|
38
|
+
- CHROMEDRIVER_VERSION=`curl -s "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$CHROME_MAIN_VERSION"`
|
39
|
+
- curl "https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip" -O
|
40
|
+
- unzip chromedriver_linux64.zip -d ~/bin
|
41
|
+
|
42
|
+
script:
|
43
|
+
- bundle exec rake test_app
|
44
|
+
- bundle exec rake spec
|
data/Appraisals
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -2,14 +2,20 @@ require 'bundler'
|
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
3
|
|
4
4
|
require 'rspec/core/rake_task'
|
5
|
-
require 'spree/testing_support/
|
5
|
+
require 'spree/testing_support/extension_rake'
|
6
6
|
|
7
7
|
RSpec::Core::RakeTask.new
|
8
8
|
|
9
|
-
task default
|
9
|
+
task :default do
|
10
|
+
if Dir["spec/dummy"].empty?
|
11
|
+
Rake::Task[:test_app].invoke
|
12
|
+
Dir.chdir("../../")
|
13
|
+
end
|
14
|
+
Rake::Task[:spec].invoke
|
15
|
+
end
|
10
16
|
|
11
17
|
desc 'Generates a dummy app for testing'
|
12
18
|
task :test_app do
|
13
19
|
ENV['LIB_NAME'] = 'spree/auth'
|
14
|
-
Rake::Task['
|
20
|
+
Rake::Task['extension:test_app'].invoke
|
15
21
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Spree
|
2
|
+
module Api
|
3
|
+
module V2
|
4
|
+
module Storefront
|
5
|
+
class AccountConfirmationsController < ::Spree::Api::V2::BaseController
|
6
|
+
|
7
|
+
def show
|
8
|
+
user = Spree.user_class.confirm_by_token(params[:id])
|
9
|
+
|
10
|
+
if user.errors.empty?
|
11
|
+
render json: { data: { state: user.respond_to?(:state) ? user.state : '' } }, status: :ok
|
12
|
+
else
|
13
|
+
render json: { error: user.errors.full_messages.to_sentence }, status: :unprocessable_entity
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Spree
|
2
|
+
module Api
|
3
|
+
module V2
|
4
|
+
module Storefront
|
5
|
+
class PasswordsController < ::Spree::Api::V2::BaseController
|
6
|
+
include Spree::Core::ControllerHelpers::Store
|
7
|
+
|
8
|
+
def create
|
9
|
+
user = Spree.user_class.find_by(email: params[:user][:email])
|
10
|
+
|
11
|
+
if user&.send_reset_password_instructions(current_store)
|
12
|
+
head :ok
|
13
|
+
else
|
14
|
+
head :not_found
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def update
|
19
|
+
user = Spree.user_class.reset_password_by_token(
|
20
|
+
password: params[:user][:password],
|
21
|
+
password_confirmation: params[:user][:password_confirmation],
|
22
|
+
reset_password_token: params[:id]
|
23
|
+
)
|
24
|
+
|
25
|
+
if user.errors.empty?
|
26
|
+
head :ok
|
27
|
+
else
|
28
|
+
render json: { error: user.errors.full_messages.to_sentence }, status: :unprocessable_entity
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -20,7 +20,7 @@ class Spree::UserPasswordsController < Devise::PasswordsController
|
|
20
20
|
# respond_with resource, :location => spree.login_path
|
21
21
|
#
|
22
22
|
def create
|
23
|
-
self.resource = resource_class.send_reset_password_instructions(params[resource_name])
|
23
|
+
self.resource = resource_class.send_reset_password_instructions(params[resource_name], current_store)
|
24
24
|
|
25
25
|
if resource.errors.empty?
|
26
26
|
set_flash_message(:notice, :send_instructions) if is_navigational_format?
|
@@ -1,9 +1,13 @@
|
|
1
1
|
module Spree
|
2
2
|
class UserMailer < BaseMailer
|
3
3
|
def reset_password_instructions(user, token, *_args)
|
4
|
-
|
4
|
+
current_store_id = _args.inject(:merge)[:current_store_id]
|
5
|
+
@current_store = Spree::Store.find(current_store_id) || Spree::Store.current
|
6
|
+
@locale = @current_store.has_attribute?(:default_locale) ? @current_store.default_locale : I18n.default_locale
|
7
|
+
I18n.locale = @locale if @locale.present?
|
8
|
+
@edit_password_reset_url = spree.edit_spree_user_password_url(reset_password_token: token, host: @current_store.url)
|
5
9
|
|
6
|
-
mail to: user.email, from: from_address, subject:
|
10
|
+
mail to: user.email, from: from_address, subject: @current_store.name + ' ' + I18n.t(:subject, scope: [:devise, :mailer, :reset_password_instructions])
|
7
11
|
end
|
8
12
|
|
9
13
|
def confirmation_instructions(user, token, _opts = {})
|
data/app/models/spree/user.rb
CHANGED
@@ -27,6 +27,23 @@ module Spree
|
|
27
27
|
has_spree_role?('admin')
|
28
28
|
end
|
29
29
|
|
30
|
+
def self.send_reset_password_instructions(attributes={}, current_store)
|
31
|
+
recoverable = find_or_initialize_with_errors(reset_password_keys, attributes, :not_found)
|
32
|
+
recoverable.send_reset_password_instructions(current_store) if recoverable.persisted?
|
33
|
+
recoverable
|
34
|
+
end
|
35
|
+
|
36
|
+
def send_reset_password_instructions(current_store)
|
37
|
+
token = set_reset_password_token
|
38
|
+
send_reset_password_instructions_notification(token, current_store.id)
|
39
|
+
|
40
|
+
token
|
41
|
+
end
|
42
|
+
|
43
|
+
def send_reset_password_instructions_notification(token, current_store_id)
|
44
|
+
send_devise_notification(:reset_password_instructions, token, { current_store_id: current_store_id })
|
45
|
+
end
|
46
|
+
|
30
47
|
protected
|
31
48
|
|
32
49
|
def password_required?
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Spree
|
2
|
+
module Account
|
3
|
+
class Create
|
4
|
+
prepend Spree::ServiceModule::Base
|
5
|
+
|
6
|
+
def call(user_params: nil)
|
7
|
+
user_params ||= {}
|
8
|
+
|
9
|
+
user = Spree.user_class.new(user_params)
|
10
|
+
|
11
|
+
if user.save
|
12
|
+
success(user)
|
13
|
+
else
|
14
|
+
failure(user)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Spree
|
2
|
+
module Account
|
3
|
+
class Update
|
4
|
+
prepend Spree::ServiceModule::Base
|
5
|
+
|
6
|
+
def call(user:, user_params: nil)
|
7
|
+
user_params ||= {}
|
8
|
+
|
9
|
+
if user.update(user_params)
|
10
|
+
success(user)
|
11
|
+
else
|
12
|
+
failure(user)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,10 +1,5 @@
|
|
1
|
-
|
2
|
-
If you did not make this request, simply ignore this email.
|
3
|
-
|
4
|
-
If you did make this request just click the link below:
|
1
|
+
<%= Spree.t('user_mailer.reset_password_instructions.instructions_1') %>
|
5
2
|
|
6
3
|
<%= @edit_password_reset_url %>
|
7
4
|
|
8
|
-
|
9
|
-
If you continue to have problems please feel free to contact us.
|
10
|
-
|
5
|
+
<%= Spree.t('user_mailer.reset_password_instructions.instructions_2') %>
|
data/config/locales/de.yml
CHANGED
@@ -1,9 +1,23 @@
|
|
1
1
|
---
|
2
2
|
de:
|
3
|
+
spree:
|
4
|
+
admin_login: Admin Login
|
5
|
+
change_your_password: Kennwort zurücksetzen
|
6
|
+
store_credits:
|
7
|
+
credit_balance: Saldo des Guthabens
|
8
|
+
user_mailer:
|
9
|
+
reset_password_instructions:
|
10
|
+
instructions_1: "Es wurde eine Anfrage zum Zurücksetzen Ihres Passworts gestellt.\nWenn Sie diese Anfrage nicht gestellt haben, ignorieren Sie diese E-Mail.\n\nWenn Sie diese Anfrage gestellt haben, klicken Sie bitte auf den folgenden Link:"
|
11
|
+
instructions_2: "Falls die obige URL nicht funktioniert, bitte URL kopieren und in Ihren Browser einfügen\nWenn Sie weiterhin Probleme haben, können Sie sich gerne an uns wenden."
|
12
|
+
confirmation_instructions:
|
13
|
+
welcome: "Schön, dass Sie hier sind %{email}"
|
14
|
+
confirm: "Sie können Ihre Konto-E-Mail-Adresse über die folgende URL bestätigen:"
|
3
15
|
devise:
|
4
16
|
confirmations:
|
5
17
|
confirmed: Ihr Konto wurde erfolgreich aktiviert.
|
6
18
|
send_instructions: 'In ein paar Minuten erhalten Sie eine E-Mail mit Anweisungen, um Ihr Konto zu aktivieren.'
|
19
|
+
spree_user:
|
20
|
+
already_confirmed: Ihre E-Mail wurde bereits bestätigt. Bitte versuchen Sie erneut, sich anzumelden.
|
7
21
|
failure:
|
8
22
|
inactive: Ihr Konto wurde noch nicht aktiviert.
|
9
23
|
invalid: Ungültige E-Mail-Adresse oder Passwort.
|
@@ -28,16 +42,20 @@ de:
|
|
28
42
|
user_passwords:
|
29
43
|
spree_user:
|
30
44
|
cannot_be_blank: Ihr Passwort darf nicht leer sein.
|
45
|
+
no_token: Sie können nicht auf diese Seite zugreifen, wenn Sie den Link aus einer E-Mail zum Zurücksetzen des Kennworts nicht verwenden. Wenn Sie den Link aus einer E-Mail zum Zurücksetzen des Passworts verwenden, stellen Sie bitte sicher, dass Sie die vollständige URL verwendet haben.
|
31
46
|
send_instructions: In ein paar Minuten erhalten Sie eine E-Mail mit Anweisungen um Ihr Passwort zurücksetzen.
|
32
47
|
updated: Ihr Passwort wurde erfolgreich geändert.
|
33
48
|
user_registrations:
|
34
49
|
destroyed: Ihr Konto wurde erfolgreich gelöscht. Auf Wiedersehen!
|
35
50
|
inactive_signed_up: 'Sie haben sich erfolgreich registriert. Wir konnten Sie jedoch nicht anmelden, da Ihr Konto %{reason} ist.'
|
51
|
+
signed_up_but_unconfirmed: Eine Nachricht mit einem Bestätigungslink wurde an Ihre E-Mail-Adresse gesendet. Bitte folgen Sie dem Link, um Ihr Konto zu aktivieren.
|
36
52
|
signed_up: Herzlich Willkommen! Sie haben sich erfolgreich registriert.
|
37
53
|
updated: Sie haben Ihr Konto erfolgreich aktualisiert.
|
38
54
|
user_sessions:
|
39
55
|
signed_in: Erfolgreich angemeldet.
|
40
56
|
signed_out: Erfolgreich abgemeldet.
|
57
|
+
already_signed_in: Bereits angemeldet.
|
58
|
+
already_signed_out: Bereits abgemeldet.
|
41
59
|
errors:
|
42
60
|
messages:
|
43
61
|
already_confirmed: wurde bereits bestätigt
|
data/config/locales/en.yml
CHANGED
@@ -5,6 +5,13 @@ en:
|
|
5
5
|
change_your_password: "Change your password"
|
6
6
|
store_credits:
|
7
7
|
credit_balance: Store Credit Balance
|
8
|
+
user_mailer:
|
9
|
+
reset_password_instructions:
|
10
|
+
instructions_1: "A request to reset your password has been made.\nIf you did not make this request, simply ignore this email.\n\nIf you did make this request just click the link below:"
|
11
|
+
instructions_2: "If the above URL does not work try copying and pasting it into your browser.\nIf you continue to have problems please feel free to contact us."
|
12
|
+
confirmation_instructions:
|
13
|
+
welcome: "Welcome %{email}!"
|
14
|
+
confirm: "You can confirm your account email through the url below:"
|
8
15
|
devise:
|
9
16
|
confirmations:
|
10
17
|
confirmed: Your account was successfully confirmed. You are now signed in.
|
@@ -26,8 +33,6 @@ en:
|
|
26
33
|
subject: Reset password instructions
|
27
34
|
unlock_instructions:
|
28
35
|
subject: Unlock Instructions
|
29
|
-
confirmation_instructions:
|
30
|
-
subject: Confirmation instructions
|
31
36
|
oauth_callbacks:
|
32
37
|
failure: 'Could not authorize you from %{kind} because %{reason}.'
|
33
38
|
success: 'Successfully authorized from %{kind} account.'
|
@@ -0,0 +1,60 @@
|
|
1
|
+
---
|
2
|
+
zh-TW:
|
3
|
+
spree:
|
4
|
+
admin_login: "管理員登入"
|
5
|
+
change_your_password: "更改密碼"
|
6
|
+
store_credits:
|
7
|
+
credit_balance: 商城購物金餘額
|
8
|
+
devise:
|
9
|
+
confirmations:
|
10
|
+
confirmed: 你的帳號已經確認完成,現在你已經登入網站了。
|
11
|
+
send_instructions: 你會在幾分鐘內收到一封帳號確認信來確認你的帳號。
|
12
|
+
spree_user:
|
13
|
+
already_confirmed: Email 已確認,請登入。
|
14
|
+
failure:
|
15
|
+
inactive: 你的帳號尚未啟用。
|
16
|
+
invalid: 帳號或密碼有誤。
|
17
|
+
invalid_token: 錯誤的認證代碼。
|
18
|
+
locked: 你的帳號已經被停權,請聯絡客服人員。
|
19
|
+
timeout: 你的登入已經逾時,請重新登入。
|
20
|
+
unauthenticated: 你需要登入來繼續。
|
21
|
+
unconfirmed: 你的帳號需要確認來繼續。
|
22
|
+
mailer:
|
23
|
+
confirmation_instructions:
|
24
|
+
subject: 帳號確認教學
|
25
|
+
reset_password_instructions:
|
26
|
+
subject: 重設密碼教學
|
27
|
+
unlock_instructions:
|
28
|
+
subject: 帳號解鎖教學
|
29
|
+
oauth_callbacks:
|
30
|
+
failure: '由於%{reason},無法透過%{kind}確認你的帳號。'
|
31
|
+
success: '成功的由%{kind}認證你的帳號。'
|
32
|
+
unlocks:
|
33
|
+
send_instructions: 你在幾分鐘後會收到一封 Email 教你如何解鎖帳號。
|
34
|
+
unlocked: 你的帳號已經解鎖,現在你已經登入網站了。
|
35
|
+
user_passwords:
|
36
|
+
spree_user:
|
37
|
+
cannot_be_blank: 密碼不能為空白。
|
38
|
+
no_token: "你只能透過重新設定密碼的 Email 內的連結來訪問此頁面。如果你真的是透過那封 Email 來此頁面,請確定你是透過完整的網址過來的。"
|
39
|
+
send_instructions: 你在幾分鐘後會收到一封 Email 教你如何更改密碼。
|
40
|
+
updated: 你的密碼已經更改成功,你已成功登入。
|
41
|
+
user_registrations:
|
42
|
+
destroyed: 再見!你的帳號已經被取消了,但我們希望能再服務你。
|
43
|
+
inactive_signed_up: '你已經成功註冊,但由於%{reason}的原因,導致帳號無法登入。'
|
44
|
+
signed_up_but_unconfirmed: 確認信件已經寄到您的信箱,請按照上面的教學完成您的註冊。
|
45
|
+
signed_up: 歡迎!你已經成功註冊了。
|
46
|
+
updated: 你的帳號已經成功更新。
|
47
|
+
user_sessions:
|
48
|
+
signed_in: 登入成功
|
49
|
+
signed_out: 登出成功
|
50
|
+
already_signed_in: 已經登入
|
51
|
+
already_signed_out: 已經登入
|
52
|
+
errors:
|
53
|
+
messages:
|
54
|
+
already_confirmed: 已確認
|
55
|
+
email_is_invalid: Email 不能為空值
|
56
|
+
not_found: 找不到
|
57
|
+
not_locked: 沒有被鎖住
|
58
|
+
not_saved:
|
59
|
+
one: '%{resource}由於以下的一個錯誤導致無法被儲存:'
|
60
|
+
other: '%{resource}由於以下的%{count}個錯誤導致無法被儲存:'
|
data/config/routes.rb
CHANGED
@@ -44,4 +44,14 @@ Spree::Core::Engine.add_routes do
|
|
44
44
|
get '/logout' => 'user_sessions#destroy', :as => :logout
|
45
45
|
end
|
46
46
|
end
|
47
|
+
|
48
|
+
namespace :api, defaults: { format: 'json' } do
|
49
|
+
namespace :v2 do
|
50
|
+
namespace :storefront do
|
51
|
+
resource :account, controller: :account, only: %i[show create update]
|
52
|
+
resources :account_confirmations, only: %i[show]
|
53
|
+
resources :passwords, controller: :passwords, only: %i[create update]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
47
57
|
end
|
data/gemfiles/spree_4_1.gemfile
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
module Spree
|
2
|
+
module Api
|
3
|
+
module V2
|
4
|
+
module Storefront
|
5
|
+
module AccountControllerDecorator
|
6
|
+
def self.prepended(base)
|
7
|
+
base.skip_before_action :require_spree_current_user, only: [:create]
|
8
|
+
end
|
9
|
+
|
10
|
+
def create
|
11
|
+
result = Spree::Account::Create.call(user_params: spree_user_params)
|
12
|
+
|
13
|
+
render_payload(result)
|
14
|
+
end
|
15
|
+
|
16
|
+
def update
|
17
|
+
result = Spree::Account::Update.call(user: spree_current_user, user_params: spree_user_params)
|
18
|
+
|
19
|
+
render_payload(result)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def render_payload(result)
|
25
|
+
if result.success?
|
26
|
+
render_serialized_payload { serialize_resource(result.value) }
|
27
|
+
else
|
28
|
+
render_error_payload(result.error)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def spree_user_params
|
33
|
+
params.require(:user).permit(Spree::PermittedAttributes.user_attributes)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
::Spree::Api::V2::Storefront::AccountController.prepend(Spree::Api::V2::Storefront::AccountControllerDecorator)
|
@@ -1,18 +1,14 @@
|
|
1
1
|
class Spree::UsersController < Spree::StoreController
|
2
2
|
before_action :set_current_order, except: :show
|
3
|
+
prepend_before_action :load_object, only: [:show, :edit, :update]
|
3
4
|
prepend_before_action :authorize_actions, only: :new
|
4
5
|
|
5
6
|
include Spree::Core::ControllerHelpers
|
6
7
|
|
7
8
|
def show
|
8
|
-
load_object
|
9
9
|
@orders = @user.orders.complete.order('completed_at desc')
|
10
10
|
end
|
11
11
|
|
12
|
-
def edit
|
13
|
-
load_object
|
14
|
-
end
|
15
|
-
|
16
12
|
def create
|
17
13
|
@user = Spree.user_class.new(user_params)
|
18
14
|
if @user.save
|
@@ -28,7 +24,6 @@ class Spree::UsersController < Spree::StoreController
|
|
28
24
|
end
|
29
25
|
|
30
26
|
def update
|
31
|
-
load_object
|
32
27
|
if @user.update(user_params)
|
33
28
|
if params[:user][:password].present?
|
34
29
|
# this logic needed b/c devise wants to log us out after password changes
|
data/lib/spree/auth/engine.rb
CHANGED
@@ -42,7 +42,12 @@ module Spree
|
|
42
42
|
'lib/assets/javascripts/spree/frontend/spree_auth.js',
|
43
43
|
'lib/assets/javascripts/spree/frontend/spree_auth.css'
|
44
44
|
]
|
45
|
-
Dir.glob(File.join(File.dirname(__FILE__), "../../controllers/frontend
|
45
|
+
Dir.glob(File.join(File.dirname(__FILE__), "../../controllers/frontend/**/*_decorator*.rb")) do |c|
|
46
|
+
Rails.configuration.cache_classes ? require(c) : load(c)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
if Spree::Auth::Engine.api_available?
|
50
|
+
Dir.glob(File.join(File.dirname(__FILE__), "../../controllers/api/**/*_decorator*.rb")) do |c|
|
46
51
|
Rails.configuration.cache_classes ? require(c) : load(c)
|
47
52
|
end
|
48
53
|
end
|
@@ -61,6 +66,10 @@ module Spree
|
|
61
66
|
@@frontend_available ||= ::Rails::Engine.subclasses.map(&:instance).map{ |e| e.class.to_s }.include?('Spree::Frontend::Engine')
|
62
67
|
end
|
63
68
|
|
69
|
+
def self.api_available?
|
70
|
+
@@api_available ||= ::Rails::Engine.subclasses.map(&:instance).map{ |e| e.class.to_s }.include?('Spree::Api::Engine')
|
71
|
+
end
|
72
|
+
|
64
73
|
if backend_available?
|
65
74
|
paths["app/controllers"] << "lib/controllers/backend"
|
66
75
|
paths["app/views"] << "lib/views/backend"
|
@@ -71,6 +80,10 @@ module Spree
|
|
71
80
|
paths["app/views"] << "lib/views/frontend"
|
72
81
|
end
|
73
82
|
|
83
|
+
if api_available?
|
84
|
+
paths["app/controllers"] << "lib/controllers/api"
|
85
|
+
end
|
86
|
+
|
74
87
|
config.to_prepare &method(:activate).to_proc
|
75
88
|
end
|
76
89
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
RSpec.describe Spree::Api::V2::Storefront::PasswordsController, type: :controller do
|
2
|
+
let(:user) { create(:user) }
|
3
|
+
let(:password) { 'new_password' }
|
4
|
+
let(:store) { create(:store) }
|
5
|
+
|
6
|
+
describe 'POST create' do
|
7
|
+
before { post :create, params: params }
|
8
|
+
|
9
|
+
context 'when the user email has not been specified' do
|
10
|
+
let(:params) { { user: { email: '' } } }
|
11
|
+
it 'responds with not found status' do
|
12
|
+
expect(response.code).to eq('404')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when the user email not found' do
|
17
|
+
let(:params) { { user: { email: 'dummy_email@example.com' } } }
|
18
|
+
it 'responds with not found status' do
|
19
|
+
expect(response.code).to eq('404')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when the user email has been specified' do
|
24
|
+
let(:params) { { user: { email: user.email } } }
|
25
|
+
it_behaves_like 'returns 200 HTTP status'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'PATCH update' do
|
30
|
+
before { patch :update, params: params }
|
31
|
+
|
32
|
+
context 'when updating password with blank password' do
|
33
|
+
let(:params) {
|
34
|
+
{
|
35
|
+
id: user.send_reset_password_instructions(Spree::Store.current),
|
36
|
+
user: {
|
37
|
+
password: '',
|
38
|
+
password_confirmation: ''
|
39
|
+
}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
it 'responds with error' do
|
44
|
+
expect(response.code).to eq('422')
|
45
|
+
expect(JSON.parse(response.body)['error']).to eq("Password can't be blank")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'when updating password with specified password' do
|
50
|
+
let(:params) {
|
51
|
+
{
|
52
|
+
id: user.send_reset_password_instructions(Spree::Store.current),
|
53
|
+
user: {
|
54
|
+
password: password,
|
55
|
+
password_confirmation: password
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
it_behaves_like 'returns 200 HTTP status'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -34,8 +34,14 @@ RSpec.feature 'Admin - Sign In', type: :feature do
|
|
34
34
|
fill_in 'Email', with: user.email
|
35
35
|
fill_in 'Password', with: 'secret'
|
36
36
|
click_button 'Log in'
|
37
|
-
|
38
|
-
|
37
|
+
if Spree.version.to_f > 4.1
|
38
|
+
within '.navbar .dropdown-menu' do
|
39
|
+
expect(page).to have_text 'admin@person.com'
|
40
|
+
end
|
41
|
+
else
|
42
|
+
within '.user-menu' do
|
43
|
+
expect(page).to have_text 'admin@person.com'
|
44
|
+
end
|
39
45
|
end
|
40
46
|
expect(current_path).to eq '/admin/orders'
|
41
47
|
end
|
@@ -60,7 +60,7 @@ RSpec.feature 'Checkout', :js, type: :feature do
|
|
60
60
|
find('a.cart-icon').click
|
61
61
|
|
62
62
|
expect(page).to have_text 'RoR Mug'
|
63
|
-
within('h1') { expect(page).to have_text 'YOUR SHOPPING
|
63
|
+
within('h1') { expect(page).to have_text 'YOUR SHOPPING CART' }
|
64
64
|
|
65
65
|
click_link 'checkout'
|
66
66
|
|