solidus_reviews 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +322 -0
  3. data/.travis.yml +27 -14
  4. data/Gemfile +23 -8
  5. data/LICENSE.md +2 -2
  6. data/README.md +9 -11
  7. data/Rakefile +2 -0
  8. data/app/controllers/spree/admin/feedback_reviews_controller.rb +3 -1
  9. data/app/controllers/spree/admin/review_settings_controller.rb +3 -1
  10. data/app/controllers/spree/admin/reviews_controller.rb +9 -6
  11. data/app/controllers/spree/feedback_reviews_controller.rb +25 -19
  12. data/app/controllers/spree/products_controller_decorator.rb +2 -0
  13. data/app/controllers/spree/reviews_controller.rb +11 -7
  14. data/app/helpers/spree/api/api_helpers_decorator.rb +12 -0
  15. data/app/helpers/spree/reviews_helper.rb +15 -5
  16. data/app/models/spree/feedback_review.rb +5 -4
  17. data/app/models/spree/product_decorator.rb +5 -4
  18. data/app/models/spree/review.rb +28 -10
  19. data/app/models/spree/reviews_ability.rb +17 -3
  20. data/app/models/spree/reviews_configuration.rb +16 -8
  21. data/app/models/spree/user_decorator.rb +3 -0
  22. data/app/overrides/add_reviews_after_product_properties.rb +7 -5
  23. data/app/overrides/add_reviews_tab_to_admin.rb +12 -4
  24. data/app/overrides/add_reviews_to_admin_configuration_sidebar.rb +13 -5
  25. data/app/views/spree/admin/feedback_reviews/index.html.erb +9 -9
  26. data/app/views/spree/admin/review_settings/edit.html.erb +64 -35
  27. data/app/views/spree/admin/reviews/_form.html.erb +26 -5
  28. data/app/views/spree/admin/reviews/edit.html.erb +2 -2
  29. data/app/views/spree/admin/reviews/index.html.erb +100 -88
  30. data/app/views/spree/api/reviews/_review.json.jbuilder +8 -0
  31. data/app/views/spree/api/reviews/index.json.jbuilder +6 -0
  32. data/app/views/spree/api/reviews/show.json.jbuilder +3 -0
  33. data/app/views/spree/feedback_reviews/_form.html.erb +5 -5
  34. data/app/views/spree/feedback_reviews/_summary.html.erb +3 -3
  35. data/app/views/spree/feedback_reviews/create.js.erb +2 -2
  36. data/app/views/spree/reviews/_form.html.erb +15 -10
  37. data/app/views/spree/reviews/new.html.erb +2 -2
  38. data/app/views/spree/shared/_rating.html.erb +3 -3
  39. data/app/views/spree/shared/_review.html.erb +29 -19
  40. data/app/views/spree/shared/_review_summary.html.erb +3 -3
  41. data/app/views/spree/shared/_reviews.html.erb +6 -6
  42. data/app/views/spree/shared/_shortrating.html.erb +2 -2
  43. data/bin/rails +4 -2
  44. data/config/initializers/constants.rb +2 -0
  45. data/config/initializers/load_preferences.rb +2 -0
  46. data/config/locales/de-CH.yml +14 -1
  47. data/config/locales/de.yml +14 -1
  48. data/config/locales/en-GB.yml +14 -2
  49. data/config/locales/en.yml +14 -1
  50. data/config/locales/es.yml +14 -2
  51. data/config/locales/fr.yml +14 -2
  52. data/config/locales/it.yml +79 -0
  53. data/config/locales/pl.yml +14 -2
  54. data/config/locales/pt-BR.yml +14 -2
  55. data/config/locales/pt.yml +14 -2
  56. data/config/locales/ro.yml +15 -3
  57. data/config/locales/ru.yml +14 -2
  58. data/config/locales/sv.yml +14 -1
  59. data/config/locales/tr.yml +14 -2
  60. data/config/locales/uk.yml +14 -1
  61. data/config/locales/zh-CN.yml +14 -1
  62. data/config/locales/zh-TW.yml +14 -1
  63. data/config/routes.rb +18 -1
  64. data/db/migrate/20081020220724_create_reviews.rb +4 -2
  65. data/db/migrate/20101222083309_create_feedback_reviews.rb +5 -3
  66. data/db/migrate/20110406083603_add_rating_to_products.rb +7 -5
  67. data/db/migrate/20110606150524_add_user_to_reviews.rb +4 -2
  68. data/db/migrate/20110806093221_add_ip_address_to_reviews.rb +3 -1
  69. data/db/migrate/20120110172331_namespace_tables.rb +3 -1
  70. data/db/migrate/20120123141326_recalculate_ratings.rb +6 -5
  71. data/db/migrate/20120712182514_add_locale_to_reviews.rb +4 -2
  72. data/db/migrate/20120712182627_add_locale_to_feedback_reviews.rb +4 -2
  73. data/db/migrate/20140703200946_add_show_identifier_to_reviews.rb +3 -1
  74. data/db/migrate/20190613165528_add_verified_purchaser_to_reviews.rb +5 -0
  75. data/lib/controllers/spree/api/reviews_controller.rb +111 -0
  76. data/lib/generators/solidus_reviews/install/install_generator.rb +5 -4
  77. data/lib/solidus_reviews.rb +3 -1
  78. data/lib/solidus_reviews/factories.rb +3 -1
  79. data/lib/solidus_reviews/factories/feedback_review_factory.rb +6 -5
  80. data/lib/solidus_reviews/factories/review_factory.rb +19 -9
  81. data/lib/spree_reviews/engine.rb +7 -0
  82. data/solidus_reviews.gemspec +20 -18
  83. data/spec/controllers/admin/feedback_reviews_controller_spec.rb +9 -7
  84. data/spec/controllers/admin/review_settings_controller_spec.rb +18 -16
  85. data/spec/controllers/admin/reviews_controller_spec.rb +18 -16
  86. data/spec/controllers/feedback_reviews_controller_spec.rb +29 -25
  87. data/spec/controllers/products_controller_spec.rb +4 -2
  88. data/spec/controllers/reviews_controller_spec.rb +67 -40
  89. data/spec/controllers/spree/api/reviews_controller_spec.rb +233 -0
  90. data/spec/features/admin_spec.rb +3 -0
  91. data/spec/features/reviews_spec.rb +27 -11
  92. data/spec/helpers/review_helper_spec.rb +3 -2
  93. data/spec/models/feedback_review_spec.rb +19 -17
  94. data/spec/models/product_spec.rb +41 -19
  95. data/spec/models/review_spec.rb +100 -42
  96. data/spec/models/reviews_ability_spec.rb +10 -8
  97. data/spec/models/reviews_configuration_spec.rb +28 -19
  98. data/spec/spec_helper.rb +21 -35
  99. data/vendor/assets/javascripts/jquery.rating.js +389 -376
  100. metadata +108 -59
@@ -14,6 +14,16 @@ tr:
14
14
  spree/review:
15
15
  one: bir yorum
16
16
  other: "%{count} yorumlar"
17
+ errors:
18
+ models:
19
+ spree/review:
20
+ attributes:
21
+ rating:
22
+ you_must_enter_value_for_rating: "Yorum yazmak için giriş yapmalısınız."
23
+ spree/feedback_review:
24
+ attributes:
25
+ rating:
26
+ you_must_enter_value_for_rating: "Yorum yazmak için giriş yapmalısınız."
17
27
  spree:
18
28
  approval_status: Onay Durumu
19
29
  approve: Onayla
@@ -40,16 +50,19 @@ tr:
40
50
  reviews: Yorumlar
41
51
  admin:
42
52
  tab:
53
+ reviews: Yorumlar
43
54
  review_management: Yorumlar
44
55
  review_successfully_submitted: Yorumunuz başarıyla iletildi
45
56
  spree_reviews:
46
57
  feedback_rating: Geribildirimi değerlendir
58
+ display_unapproved: Listelerde onaylanmayan yorumları göster
47
59
  include_unapproved: Listede ki onaylanmamış değerlendirmeleri dahil et
48
60
  manage_review_settings: Yorum ekranını kontrol edin
49
61
  preview_size: Yorum büyüklüğü
50
62
  require_login: Yorumları görebilmek için kullanıcı girişi
51
63
  review_settings: Yorum Ayarları
52
64
  show_email: e-posta adresini göster
65
+ show_verified_purchaser: Doğrulanmış alıcıyı göster
53
66
  track_locale: Kullanıcının yerel bilgilerini kaydet/takip et
54
67
  star:
55
68
  one: "1"
@@ -58,11 +71,10 @@ tr:
58
71
  submit_your_review: Gönder
59
72
  submitted_on: "Gönderilme Tarihi:"
60
73
  unapproved_reviews: Onaylanmamış
74
+ verified_purchaser: Doğrulanmış alıcı
61
75
  voice:
62
76
  one: "1 değerlendirme"
63
77
  other: "%{count} değerlendirme"
64
78
  was_this_review_helpful: "Bu yorum size yardımcı oldu mu?"
65
79
  write_your_own_review: Yorum Yap
66
- you_must_enter_value_for_rating: "Yorum yazmak için giriş yapmalısınız."
67
80
  anonymous: anonim
68
-
@@ -17,6 +17,16 @@ uk:
17
17
  few: '%{count} відгуки'
18
18
  many: '%{count} відгуків'
19
19
  other: '%{count} відгуків'
20
+ errors:
21
+ models:
22
+ spree/review:
23
+ attributes:
24
+ rating:
25
+ you_must_enter_value_for_rating: 'Потрібно вибрати оцінку.'
26
+ spree/feedback_review:
27
+ attributes:
28
+ rating:
29
+ you_must_enter_value_for_rating: 'Потрібно вибрати оцінку.'
20
30
  spree:
21
31
  approval_status: Підтвердження
22
32
  approve: Схвалити
@@ -44,16 +54,19 @@ uk:
44
54
  reviews: Відгуки
45
55
  admin:
46
56
  tab:
57
+ reviews: Відгуки
47
58
  review_management: Відгуки
48
59
  review_successfully_submitted: Відгук надіслано
49
60
  spree_reviews:
50
61
  feedback_rating: Оцінювати корисність
62
+ display_unapproved: Показувати в списках не схвалені відгуки
51
63
  include_unapproved: Показувати незатверджені відгуки
52
64
  manage_review_settings: Керувати відображенням відгуків
53
65
  preview_size: Розмір скороченої версії
54
66
  require_login: Тільки для зареєстрованих користувачів
55
67
  review_settings: Налаштування відгуків
56
68
  show_email: Показувати email
69
+ show_verified_purchaser: Показати підтвердженого покупця
57
70
  track_locale: Зберігати мову користувача
58
71
  star:
59
72
  one: '1'
@@ -64,6 +77,7 @@ uk:
64
77
  submit_your_review: Надіслати відгук
65
78
  submitted_on: Написано
66
79
  unapproved_reviews: Непідтверджений
80
+ verified_purchaser: Перевірений покупець
67
81
  voice:
68
82
  one: '1 голос'
69
83
  few: '%{count} голоси'
@@ -71,5 +85,4 @@ uk:
71
85
  other: '%{count} голосів'
72
86
  was_this_review_helpful: 'Цей відгук корисний для вас?'
73
87
  write_your_own_review: Напишіть свій відгук
74
- you_must_enter_value_for_rating: 'Потрібно вибрати оцінку.'
75
88
  anonymous: Анонім
@@ -14,6 +14,16 @@ zh-CN:
14
14
  spree/review:
15
15
  one: 一个评论
16
16
  other: "%{count}个评论"
17
+ errors:
18
+ models:
19
+ spree/review:
20
+ attributes:
21
+ rating:
22
+ you_must_enter_value_for_rating: "您必需输入评级"
23
+ spree/feedback_review:
24
+ attributes:
25
+ rating:
26
+ you_must_enter_value_for_rating: "您必需输入评级"
17
27
  spree:
18
28
  approve: 核准
19
29
  approved_reviews: 核准
@@ -38,16 +48,19 @@ zh-CN:
38
48
  reviews: 评论
39
49
  admin:
40
50
  tab:
51
+ reviews: 评论
41
52
  review_management: 评论
42
53
  review_successfully_submitted: 已成功递交评论。
43
54
  spree_reviews:
44
55
  feedback_rating: 评级回馈
56
+ display_unapproved: 在列表中显示未经批准的评论
45
57
  include_unapproved: 包括未核准评论在列表中
46
58
  manage_review_settings: 控制评论的显示
47
59
  preview_size: 评论片段的大小
48
60
  require_login: 用者必需登入
49
61
  review_settings: 评论设定
50
62
  show_email: 显示电邮地址
63
+ show_verified_purchaser: 显示经过验证的购买者
51
64
  track_locale: 追踪用户地域
52
65
  star:
53
66
  one: "1"
@@ -56,10 +69,10 @@ zh-CN:
56
69
  submit_your_review: 递交你的评论
57
70
  submitted_on: 递交日期
58
71
  unapproved_reviews: 沒核准
72
+ verified_purchaser: 验证购买者
59
73
  voice:
60
74
  one: "1 聲音"
61
75
  other: "%{count} 聲音"
62
76
  was_this_review_helpful: "此评论对你是否有帮助?"
63
77
  write_your_own_review: 写下您的评论
64
- you_must_enter_value_for_rating: "您必需输入评级"
65
78
  anonymous: 匿名者
@@ -14,6 +14,16 @@ zh-TW:
14
14
  spree/review:
15
15
  one: 一個評論
16
16
  other: '%{count}個評論'
17
+ errors:
18
+ models:
19
+ spree/review:
20
+ attributes:
21
+ rating:
22
+ you_must_enter_value_for_rating: 您必需輸入評級
23
+ spree/feedback_review:
24
+ attributes:
25
+ rating:
26
+ you_must_enter_value_for_rating: 您必需輸入評級
17
27
  spree:
18
28
  approve: 核準
19
29
  approved_reviews: 核準
@@ -38,16 +48,19 @@ zh-TW:
38
48
  reviews: 評論
39
49
  admin:
40
50
  tab:
51
+ reviews: 評論
41
52
  review_management: 評論
42
53
  review_successfully_submitted: 已成功遞交評論。
43
54
  spree_reviews:
44
55
  feedback_rating: 評級回饋
56
+ display_unapproved: 在列表中顯示未經批准的評論
45
57
  include_unapproved: 包括未核準評論在列表中
46
58
  manage_review_settings: 控制評論的顯示
47
59
  preview_size: 評論片段的大小
48
60
  require_login: 用者必需登入
49
61
  review_settings: 評論設定
50
62
  show_email: 顯示電郵地址
63
+ show_verified_purchaser: 顯示經過驗證的購買者
51
64
  track_locale: 追蹤用戶地域
52
65
  star:
53
66
  one: "1"
@@ -56,10 +69,10 @@ zh-TW:
56
69
  submit_your_review: 遞交你的評論
57
70
  submitted_on: 遞交日期
58
71
  unapproved_reviews: 沒核準
72
+ verified_purchaser: 驗證購買者
59
73
  voice:
60
74
  one: "1 聲音"
61
75
  other: "%{count} 聲音"
62
76
  was_this_review_helpful: 此評論對你是否有幫助?
63
77
  write_your_own_review: 寫下您的評論
64
- you_must_enter_value_for_rating: 您必需輸入評級
65
78
  anonymous: 匿名者
@@ -1,10 +1,13 @@
1
- Spree::Core::Engine.add_routes do
1
+ # frozen_string_literal: true
2
+
3
+ Spree::Core::Engine.routes.draw do
2
4
  namespace :admin do
3
5
  resources :reviews, only: [:index, :destroy, :edit, :update] do
4
6
  member do
5
7
  get :approve
6
8
  end
7
9
  resources :feedback_reviews, only: [:index, :destroy]
10
+ resources :images, only: [:destroy]
8
11
  end
9
12
  resource :review_settings, only: [:edit, :update]
10
13
  end
@@ -14,4 +17,18 @@ Spree::Core::Engine.add_routes do
14
17
  end
15
18
  end
16
19
  post '/reviews/:review_id/feedback(.:format)' => 'feedback_reviews#create', as: :feedback_reviews
20
+
21
+ if SolidusSupport.api_available?
22
+ namespace :api, defaults: { format: 'json' } do
23
+ resources :reviews, only: [:show, :create, :update, :destroy]
24
+
25
+ resources :products do
26
+ resources :reviews, only: [:index]
27
+ end
28
+
29
+ resources :users do
30
+ resources :reviews, only: [:index]
31
+ end
32
+ end
33
+ end
17
34
  end
@@ -1,4 +1,6 @@
1
- class CreateReviews < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class CreateReviews < SolidusSupport::Migration[4.2]
2
4
  def self.up
3
5
  create_table :reviews do |t|
4
6
  t.integer :product_id
@@ -7,7 +9,7 @@ class CreateReviews < ActiveRecord::Migration
7
9
  t.integer :rating
8
10
  t.text :title
9
11
  t.text :review
10
- t.boolean :approved, :default => false
12
+ t.boolean :approved, default: false
11
13
  t.timestamps
12
14
  end
13
15
  end
@@ -1,9 +1,11 @@
1
- class CreateFeedbackReviews < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class CreateFeedbackReviews < SolidusSupport::Migration[4.2]
2
4
  def self.up
3
5
  create_table :feedback_reviews do |t|
4
6
  t.integer :user_id
5
- t.integer :review_id, :null => false
6
- t.integer :rating, :default => 0
7
+ t.integer :review_id, null: false
8
+ t.integer :rating, default: 0
7
9
  t.text :comment
8
10
  t.timestamps
9
11
  end
@@ -1,11 +1,13 @@
1
- class AddRatingToProducts < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class AddRatingToProducts < SolidusSupport::Migration[4.2]
2
4
  def self.up
3
5
  if table_exists?('products')
4
- add_column :products, :avg_rating, :decimal, :default => 0.0, :null => false, :precision => 7, :scale => 5
5
- add_column :products, :reviews_count, :integer, :default => 0, :null => false
6
+ add_column :products, :avg_rating, :decimal, default: 0.0, null: false, precision: 7, scale: 5
7
+ add_column :products, :reviews_count, :integer, default: 0, null: false
6
8
  elsif table_exists?('spree_products')
7
- add_column :spree_products, :avg_rating, :decimal, :default => 0.0, :null => false, :precision => 7, :scale => 5
8
- add_column :spree_products, :reviews_count, :integer, :default => 0, :null => false
9
+ add_column :spree_products, :avg_rating, :decimal, default: 0.0, null: false, precision: 7, scale: 5
10
+ add_column :spree_products, :reviews_count, :integer, default: 0, null: false
9
11
  end
10
12
  end
11
13
 
@@ -1,6 +1,8 @@
1
- class AddUserToReviews < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class AddUserToReviews < SolidusSupport::Migration[4.2]
2
4
  def self.up
3
- add_column :reviews, :user_id, :integer, :null => true
5
+ add_column :reviews, :user_id, :integer, null: true
4
6
  end
5
7
 
6
8
  def self.down
@@ -1,4 +1,6 @@
1
- class AddIpAddressToReviews < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class AddIpAddressToReviews < SolidusSupport::Migration[4.2]
2
4
  def self.up
3
5
  add_column :reviews, :ip_address, :string
4
6
  end
@@ -1,4 +1,6 @@
1
- class NamespaceTables < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class NamespaceTables < SolidusSupport::Migration[4.2]
2
4
  def change
3
5
  rename_table :reviews, :spree_reviews
4
6
  rename_table :feedback_reviews, :spree_feedback_reviews
@@ -1,17 +1,18 @@
1
- class RecalculateRatings < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class RecalculateRatings < SolidusSupport::Migration[4.2]
2
4
  def up
3
5
  Spree::Product.reset_column_information
4
6
 
5
- Spree::Product.update_all :reviews_count => 0
6
-
7
+ Spree::Product.update_all reviews_count: 0
8
+
7
9
  Spree::Product.joins(:reviews).where("spree_reviews.id IS NOT NULL").find_each do |p|
8
- Spree::Product.update_counters p.id, :reviews_count => p.reviews.approved.length
10
+ Spree::Product.update_counters p.id, reviews_count: p.reviews.approved.length
9
11
 
10
12
  # recalculate_product_rating exists on the review, not the product
11
13
  if p.reviews.approved.count > 0
12
14
  p.reviews.approved.first.recalculate_product_rating
13
15
  end
14
-
15
16
  end
16
17
  end
17
18
 
@@ -1,6 +1,8 @@
1
- class AddLocaleToReviews < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class AddLocaleToReviews < SolidusSupport::Migration[4.2]
2
4
  def self.up
3
- add_column :spree_reviews, :locale, :string, :default => 'en'
5
+ add_column :spree_reviews, :locale, :string, default: 'en'
4
6
  end
5
7
 
6
8
  def self.down
@@ -1,6 +1,8 @@
1
- class AddLocaleToFeedbackReviews < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class AddLocaleToFeedbackReviews < SolidusSupport::Migration[4.2]
2
4
  def self.up
3
- add_column :spree_feedback_reviews, :locale, :string, :default => 'en'
5
+ add_column :spree_feedback_reviews, :locale, :string, default: 'en'
4
6
  end
5
7
 
6
8
  def self.down
@@ -1,4 +1,6 @@
1
- class AddShowIdentifierToReviews < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class AddShowIdentifierToReviews < SolidusSupport::Migration[4.2]
2
4
  def change
3
5
  add_column :spree_reviews, :show_identifier, :boolean, default: true
4
6
  add_index :spree_reviews, :show_identifier
@@ -0,0 +1,5 @@
1
+ class AddVerifiedPurchaserToReviews < SolidusSupport::Migration[4.2]
2
+ def change
3
+ add_column :spree_reviews, :verified_purchaser, :boolean, default: false
4
+ end
5
+ end
@@ -0,0 +1,111 @@
1
+ module Spree
2
+ module Api
3
+ class ReviewsController < Spree::Api::BaseController
4
+ respond_to :json
5
+
6
+ before_action :load_review, only: [:show, :update, :destroy]
7
+ before_action :load_product, :find_review_user
8
+ before_action :sanitize_rating, only: [:create, :update]
9
+ before_action :prevent_multiple_reviews, only: [:create]
10
+
11
+ def index
12
+ if @product
13
+ @reviews = Spree::Review.default_approval_filter.where(product: @product)
14
+ else
15
+ @reviews = Spree::Review.where(user: @current_api_user)
16
+ end
17
+
18
+ respond_with(@reviews)
19
+ end
20
+
21
+ def show
22
+ authorize! :read, @review
23
+ render json: @review, include: [:images, :feedback_reviews]
24
+ end
25
+
26
+ def create
27
+ return not_found if @product.nil?
28
+
29
+ @review = Spree::Review.new(review_params)
30
+ @review.product = @product
31
+ @review.user = @current_api_user
32
+ @review.ip_address = request.remote_ip
33
+ @review.locale = I18n.locale.to_s if Spree::Reviews::Config[:track_locale]
34
+
35
+ authorize! :create, @review
36
+ if @review.save
37
+ render json: @review, include: [:images, :feedback_reviews], status: 201
38
+ else
39
+ invalid_resource!(@review)
40
+ end
41
+ end
42
+
43
+ def update
44
+ authorize! :update, @review
45
+
46
+ attributes = review_params.merge(ip_address: request.remote_ip, approved: false)
47
+
48
+ if @review.update(attributes)
49
+ render json: @review, include: [:images, :feedback_reviews], status: 200
50
+ else
51
+ invalid_resource!(@review)
52
+ end
53
+ end
54
+
55
+ def destroy
56
+ authorize! :destroy, @review
57
+
58
+ if @review.destroy
59
+ render json: @review, status: 200
60
+ else
61
+ invalid_resource!(@review)
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def permitted_review_attributes
68
+ [:product_id, :rating, :title, :review, :name, :show_identifier]
69
+ end
70
+
71
+ def review_params
72
+ params.permit(permitted_review_attributes)
73
+ end
74
+
75
+ # Loads product from product id.
76
+ def load_product
77
+ if params[:product_id]
78
+ @product = Spree::Product.friendly.find(params[:product_id])
79
+ else
80
+ @product = @review&.product
81
+ end
82
+ end
83
+
84
+ # Finds user based on api_key or by user_id if api_key belongs to an admin.
85
+ def find_review_user
86
+ if params[:user_id] && @current_user_roles.include?('admin')
87
+ @current_api_user = Spree.user_class.find(params[:user_id])
88
+ end
89
+ end
90
+
91
+ # Loads any review that is shared between the user and product
92
+ def load_review
93
+ @review = Spree::Review.find(params[:id])
94
+ end
95
+
96
+ # Ensures that a user can't create more than 1 review per product
97
+ def prevent_multiple_reviews
98
+ @review = @current_api_user.reviews.find_by(product: @product)
99
+ if @review.present?
100
+ invalid_resource!(@review)
101
+ end
102
+ end
103
+
104
+ # Converts rating strings like "5 units" to "5"
105
+ # Operates on params
106
+ def sanitize_rating
107
+ params[:rating].sub!(/\s*[^0-9]*\z/, '') unless params[:rating].blank?
108
+ end
109
+ end
110
+ end
111
+ end