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.
- checksums.yaml +5 -5
- data/.rubocop.yml +322 -0
- data/.travis.yml +27 -14
- data/Gemfile +23 -8
- data/LICENSE.md +2 -2
- data/README.md +9 -11
- data/Rakefile +2 -0
- data/app/controllers/spree/admin/feedback_reviews_controller.rb +3 -1
- data/app/controllers/spree/admin/review_settings_controller.rb +3 -1
- data/app/controllers/spree/admin/reviews_controller.rb +9 -6
- data/app/controllers/spree/feedback_reviews_controller.rb +25 -19
- data/app/controllers/spree/products_controller_decorator.rb +2 -0
- data/app/controllers/spree/reviews_controller.rb +11 -7
- data/app/helpers/spree/api/api_helpers_decorator.rb +12 -0
- data/app/helpers/spree/reviews_helper.rb +15 -5
- data/app/models/spree/feedback_review.rb +5 -4
- data/app/models/spree/product_decorator.rb +5 -4
- data/app/models/spree/review.rb +28 -10
- data/app/models/spree/reviews_ability.rb +17 -3
- data/app/models/spree/reviews_configuration.rb +16 -8
- data/app/models/spree/user_decorator.rb +3 -0
- data/app/overrides/add_reviews_after_product_properties.rb +7 -5
- data/app/overrides/add_reviews_tab_to_admin.rb +12 -4
- data/app/overrides/add_reviews_to_admin_configuration_sidebar.rb +13 -5
- data/app/views/spree/admin/feedback_reviews/index.html.erb +9 -9
- data/app/views/spree/admin/review_settings/edit.html.erb +64 -35
- data/app/views/spree/admin/reviews/_form.html.erb +26 -5
- data/app/views/spree/admin/reviews/edit.html.erb +2 -2
- data/app/views/spree/admin/reviews/index.html.erb +100 -88
- data/app/views/spree/api/reviews/_review.json.jbuilder +8 -0
- data/app/views/spree/api/reviews/index.json.jbuilder +6 -0
- data/app/views/spree/api/reviews/show.json.jbuilder +3 -0
- data/app/views/spree/feedback_reviews/_form.html.erb +5 -5
- data/app/views/spree/feedback_reviews/_summary.html.erb +3 -3
- data/app/views/spree/feedback_reviews/create.js.erb +2 -2
- data/app/views/spree/reviews/_form.html.erb +15 -10
- data/app/views/spree/reviews/new.html.erb +2 -2
- data/app/views/spree/shared/_rating.html.erb +3 -3
- data/app/views/spree/shared/_review.html.erb +29 -19
- data/app/views/spree/shared/_review_summary.html.erb +3 -3
- data/app/views/spree/shared/_reviews.html.erb +6 -6
- data/app/views/spree/shared/_shortrating.html.erb +2 -2
- data/bin/rails +4 -2
- data/config/initializers/constants.rb +2 -0
- data/config/initializers/load_preferences.rb +2 -0
- data/config/locales/de-CH.yml +14 -1
- data/config/locales/de.yml +14 -1
- data/config/locales/en-GB.yml +14 -2
- data/config/locales/en.yml +14 -1
- data/config/locales/es.yml +14 -2
- data/config/locales/fr.yml +14 -2
- data/config/locales/it.yml +79 -0
- data/config/locales/pl.yml +14 -2
- data/config/locales/pt-BR.yml +14 -2
- data/config/locales/pt.yml +14 -2
- data/config/locales/ro.yml +15 -3
- data/config/locales/ru.yml +14 -2
- data/config/locales/sv.yml +14 -1
- data/config/locales/tr.yml +14 -2
- data/config/locales/uk.yml +14 -1
- data/config/locales/zh-CN.yml +14 -1
- data/config/locales/zh-TW.yml +14 -1
- data/config/routes.rb +18 -1
- data/db/migrate/20081020220724_create_reviews.rb +4 -2
- data/db/migrate/20101222083309_create_feedback_reviews.rb +5 -3
- data/db/migrate/20110406083603_add_rating_to_products.rb +7 -5
- data/db/migrate/20110606150524_add_user_to_reviews.rb +4 -2
- data/db/migrate/20110806093221_add_ip_address_to_reviews.rb +3 -1
- data/db/migrate/20120110172331_namespace_tables.rb +3 -1
- data/db/migrate/20120123141326_recalculate_ratings.rb +6 -5
- data/db/migrate/20120712182514_add_locale_to_reviews.rb +4 -2
- data/db/migrate/20120712182627_add_locale_to_feedback_reviews.rb +4 -2
- data/db/migrate/20140703200946_add_show_identifier_to_reviews.rb +3 -1
- data/db/migrate/20190613165528_add_verified_purchaser_to_reviews.rb +5 -0
- data/lib/controllers/spree/api/reviews_controller.rb +111 -0
- data/lib/generators/solidus_reviews/install/install_generator.rb +5 -4
- data/lib/solidus_reviews.rb +3 -1
- data/lib/solidus_reviews/factories.rb +3 -1
- data/lib/solidus_reviews/factories/feedback_review_factory.rb +6 -5
- data/lib/solidus_reviews/factories/review_factory.rb +19 -9
- data/lib/spree_reviews/engine.rb +7 -0
- data/solidus_reviews.gemspec +20 -18
- data/spec/controllers/admin/feedback_reviews_controller_spec.rb +9 -7
- data/spec/controllers/admin/review_settings_controller_spec.rb +18 -16
- data/spec/controllers/admin/reviews_controller_spec.rb +18 -16
- data/spec/controllers/feedback_reviews_controller_spec.rb +29 -25
- data/spec/controllers/products_controller_spec.rb +4 -2
- data/spec/controllers/reviews_controller_spec.rb +67 -40
- data/spec/controllers/spree/api/reviews_controller_spec.rb +233 -0
- data/spec/features/admin_spec.rb +3 -0
- data/spec/features/reviews_spec.rb +27 -11
- data/spec/helpers/review_helper_spec.rb +3 -2
- data/spec/models/feedback_review_spec.rb +19 -17
- data/spec/models/product_spec.rb +41 -19
- data/spec/models/review_spec.rb +100 -42
- data/spec/models/reviews_ability_spec.rb +10 -8
- data/spec/models/reviews_configuration_spec.rb +28 -19
- data/spec/spec_helper.rb +21 -35
- data/vendor/assets/javascripts/jquery.rating.js +389 -376
- metadata +108 -59
data/config/locales/tr.yml
CHANGED
@@ -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
|
-
|
data/config/locales/uk.yml
CHANGED
@@ -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: Анонім
|
data/config/locales/zh-CN.yml
CHANGED
@@ -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: 匿名者
|
data/config/locales/zh-TW.yml
CHANGED
@@ -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: 匿名者
|
data/config/routes.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
-
|
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
|
-
|
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, :
|
12
|
+
t.boolean :approved, default: false
|
11
13
|
t.timestamps
|
12
14
|
end
|
13
15
|
end
|
@@ -1,9 +1,11 @@
|
|
1
|
-
|
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, :
|
6
|
-
t.integer :rating, :
|
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
|
-
|
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, :
|
5
|
-
add_column :products, :reviews_count, :integer, :
|
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, :
|
8
|
-
add_column :spree_products, :reviews_count, :integer, :
|
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
|
-
|
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, :
|
5
|
+
add_column :reviews, :user_id, :integer, null: true
|
4
6
|
end
|
5
7
|
|
6
8
|
def self.down
|
@@ -1,17 +1,18 @@
|
|
1
|
-
|
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 :
|
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, :
|
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
|
-
|
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, :
|
5
|
+
add_column :spree_reviews, :locale, :string, default: 'en'
|
4
6
|
end
|
5
7
|
|
6
8
|
def self.down
|
@@ -1,6 +1,8 @@
|
|
1
|
-
|
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, :
|
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
|
-
|
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,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
|