atkhayar-dev-spree-multi-vendor 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -0
  3. data/LICENSE +26 -0
  4. data/README.md +181 -0
  5. data/Rakefile +21 -0
  6. data/app/controllers/spree/admin/vendor_settings_controller.rb +34 -0
  7. data/app/controllers/spree/admin/vendors_controller.rb +68 -0
  8. data/app/controllers/spree/api/v1/vendors_controller.rb +62 -0
  9. data/app/controllers/spree/api/v2/platform/vendors_controller.rb +32 -0
  10. data/app/controllers/spree/api/v2/storefront/vendors_controller.rb +33 -0
  11. data/app/controllers/spree_multi_vendor/spree/admin/base_controller_decorator.rb +10 -0
  12. data/app/controllers/spree_multi_vendor/spree/admin/products_controller_decorator.rb +79 -0
  13. data/app/controllers/spree_multi_vendor/spree/admin/resource_controller_decorator.rb +8 -0
  14. data/app/controllers/spree_multi_vendor/spree/admin/shipping_methods_controller_decorator.rb +7 -0
  15. data/app/controllers/spree_multi_vendor/spree/admin/stock_locations_controller_decorator.rb +7 -0
  16. data/app/controllers/spree_multi_vendor/spree/admin/users_controller_decorator.rb +13 -0
  17. data/app/controllers/spree_multi_vendor/spree/admin/variants_controller_decorator.rb +7 -0
  18. data/app/controllers/spree_multi_vendor/spree/api/base_controller_decorator.rb +17 -0
  19. data/app/controllers/spree_multi_vendor/spree/api/v1/products_controller_decorator.rb +9 -0
  20. data/app/controllers/spree_multi_vendor/spree/api/v1/users_controller_decorator.rb +13 -0
  21. data/app/controllers/spree_multi_vendor/spree/api/v2/platform/products_controller_decorator.rb +65 -0
  22. data/app/finders/spree_multi_vendor/products_finder_decorator.rb +31 -0
  23. data/app/helpers/spree/admin/vendor_helper.rb +15 -0
  24. data/app/helpers/spree/api/vendor_helper.rb +13 -0
  25. data/app/helpers/spree_multi_vendor/spree/api/api_helpers_decorator.rb +19 -0
  26. data/app/mailers/spree/vendor_mailer.rb +15 -0
  27. data/app/models/concerns/spree/vendor_concern.rb +11 -0
  28. data/app/models/spree/order_commission.rb +11 -0
  29. data/app/models/spree/vendor.rb +77 -0
  30. data/app/models/spree/vendor_ability.rb +155 -0
  31. data/app/models/spree/vendor_image.rb +18 -0
  32. data/app/models/spree/vendor_order_totals.rb +28 -0
  33. data/app/models/spree/vendor_user.rb +16 -0
  34. data/app/models/spree_multi_vendor/configuration.rb +10 -0
  35. data/app/models/spree_multi_vendor/spree/ability_decorator.rb +9 -0
  36. data/app/models/spree_multi_vendor/spree/base_decorator.rb +13 -0
  37. data/app/models/spree_multi_vendor/spree/line_item_decorator.rb +48 -0
  38. data/app/models/spree_multi_vendor/spree/order_decorator.rb +107 -0
  39. data/app/models/spree_multi_vendor/spree/shipment_decorator.rb +8 -0
  40. data/app/models/spree_multi_vendor/spree/stock/package_decorator.rb +14 -0
  41. data/app/models/spree_multi_vendor/spree/user_decorator.rb +8 -0
  42. data/app/models/spree_multi_vendor/spree/variant_decorator.rb +40 -0
  43. data/app/overrides/spree/admin/orders/_form.rb +13 -0
  44. data/app/overrides/spree/admin/orders/_line_items.rb +6 -0
  45. data/app/overrides/spree/admin/orders/_line_items_edit_form.rb +6 -0
  46. data/app/overrides/spree/admin/orders/index.rb +6 -0
  47. data/app/overrides/spree/admin/products/form.rb +29 -0
  48. data/app/overrides/spree/admin/products/new.rb +16 -0
  49. data/app/overrides/spree/admin/shared/_main_menu.rb +23 -0
  50. data/app/overrides/spree/admin/shared/_order_summary.rb +35 -0
  51. data/app/overrides/spree/admin/users/_form.rb +13 -0
  52. data/app/serializers/spree/api/v2/platform/vendor_serializer.rb +12 -0
  53. data/app/serializers/spree/v2/storefront/vendor_image_serializer.rb +11 -0
  54. data/app/serializers/spree/v2/storefront/vendor_order_totals_serializer.rb +20 -0
  55. data/app/serializers/spree/v2/storefront/vendor_serializer.rb +15 -0
  56. data/app/serializers/spree_multi_vendor/cart_serializer_decorator.rb +19 -0
  57. data/app/serializers/spree_multi_vendor/serializer_decorator.rb +23 -0
  58. data/app/services/spree/orders/generate_commissions.rb +34 -0
  59. data/app/views/spree/admin/translations/vendor.html.erb +21 -0
  60. data/app/views/spree/admin/vendor_settings/edit.html.erb +47 -0
  61. data/app/views/spree/admin/vendors/_form.html.erb +36 -0
  62. data/app/views/spree/admin/vendors/edit.html.erb +11 -0
  63. data/app/views/spree/admin/vendors/index.html.erb +83 -0
  64. data/app/views/spree/admin/vendors/new.html.erb +11 -0
  65. data/app/views/spree/api/v1/vendors/index.rabl +3 -0
  66. data/app/views/spree/api/v1/vendors/show.rabl +2 -0
  67. data/app/views/spree/vendor_mailer/vendor_notification_email.html.erb +81 -0
  68. data/app/views/spree/vendor_mailer/vendor_notification_email.text.erb +36 -0
  69. data/bin/rails +7 -0
  70. data/config/initializers/spree.rb +31 -0
  71. data/config/initializers/spree_permitted_attributes.rb +12 -0
  72. data/config/locales/en.yml +34 -0
  73. data/config/locales/es.yml +36 -0
  74. data/config/locales/fr.yml +33 -0
  75. data/config/routes.rb +29 -0
  76. data/db/default/vendors.rb +13 -0
  77. data/db/migrate/20170406102250_create_spree_vendors.rb +9 -0
  78. data/db/migrate/20170406102944_add_vendor_id_to_spree_models.rb +10 -0
  79. data/db/migrate/20170410111150_add_state_to_vendors.rb +6 -0
  80. data/db/migrate/20170412124925_add_deleted_at_to_spree_vendors.rb +6 -0
  81. data/db/migrate/20170413094447_create_spree_vendor_users.rb +11 -0
  82. data/db/migrate/20190212161426_add_slug_to_spree_vendors.rb +6 -0
  83. data/db/migrate/20190214120226_add_about_us_to_spree_vendors.rb +5 -0
  84. data/db/migrate/20190214142526_add_contact_us_to_spree_vendors.rb +5 -0
  85. data/db/migrate/20190305120337_add_commission_to_spree_vendors.rb +5 -0
  86. data/db/migrate/20190308091546_add_priority_to_vendor.rb +8 -0
  87. data/db/migrate/20190312130754_create_spree_order_commissions.rb +14 -0
  88. data/db/migrate/20190322133128_add_notification_email_to_vendors.rb +5 -0
  89. data/db/migrate/20200416030721_add_translations_to_vendor.rb +19 -0
  90. data/db/migrate/20210728120649_change_vendorized_models_vendor_id_type.rb +10 -0
  91. data/db/migrate/20210728120910_change_vendor_id_and_user_id_type_for_spree_vendor_users.rb +14 -0
  92. data/db/migrate/20210728121024_change_vendor_id_and_order_id_type_for_spree_order_commissions.rb +14 -0
  93. data/db/migrate/20221123095256_add_code_to_vendors.rb +6 -0
  94. data/lib/generators/spree_multi_vendor/install/install_generator.rb +21 -0
  95. data/lib/generators/spree_multi_vendor/mailers_preview/mailers_preview_generator.rb +22 -0
  96. data/lib/generators/spree_multi_vendor/mailers_preview/templates/mailers/previews/vendor_notification_preview.rb +5 -0
  97. data/lib/spree_multi_vendor/engine.rb +24 -0
  98. data/lib/spree_multi_vendor/factories.rb +7 -0
  99. data/lib/spree_multi_vendor/version.rb +11 -0
  100. data/lib/spree_multi_vendor.rb +16 -0
  101. data/lib/tasks/vendors.rake +8 -0
  102. data/spec/factories/spree/vendor_factory.rb +28 -0
  103. data/spec/factories/spree/vendor_image_factory.rb +5 -0
  104. data/spec/factories/spree/vendor_user_factory.rb +6 -0
  105. data/spec/features/spree/admin/orders_spec.rb +86 -0
  106. data/spec/features/spree/admin/product_spec.rb +177 -0
  107. data/spec/features/spree/admin/shipping_method_spec.rb +72 -0
  108. data/spec/features/spree/admin/stock_location_spec.rb +90 -0
  109. data/spec/features/spree/admin/vendor_settings_spec.rb +74 -0
  110. data/spec/features/spree/admin/vendor_spec.rb +125 -0
  111. data/spec/fixtures/thinking-cat.jpg +0 -0
  112. data/spec/mailers/vendor_mailer_spec.rb +45 -0
  113. data/spec/models/spree/line_item_spec.rb +32 -0
  114. data/spec/models/spree/order_commission_spec.rb +8 -0
  115. data/spec/models/spree/order_spec.rb +193 -0
  116. data/spec/models/spree/product_spec.rb +19 -0
  117. data/spec/models/spree/variant_spec.rb +104 -0
  118. data/spec/models/spree/vendor_order_totals_spec.rb +33 -0
  119. data/spec/models/spree/vendor_spec.rb +57 -0
  120. data/spec/models/spree/vendor_user_spec.rb +12 -0
  121. data/spec/requests/spree/api/v1/products_spec.rb +221 -0
  122. data/spec/requests/spree/api/v1/users_spec.rb +31 -0
  123. data/spec/requests/spree/api/v1/vendors_spec.rb +210 -0
  124. data/spec/requests/spree/api/v2/storefront/cart_spec.rb +85 -0
  125. data/spec/requests/spree/api/v2/storefront/products_spec.rb +96 -0
  126. data/spec/requests/spree/api/v2/storefront/vendors_spec.rb +118 -0
  127. data/spec/serializers/spree/v2/storefront/stock_location_serializer_spec.rb +32 -0
  128. data/spec/serializers/spree/v2/storefront/vendor_image_serializer_spec.rb +18 -0
  129. data/spec/serializers/spree/v2/storefront/vendor_order_totals_serializer_spec.rb +54 -0
  130. data/spec/serializers/spree/v2/storefront/vendor_serializer_spec.rb +34 -0
  131. data/spec/spec_helper.rb +13 -0
  132. data/spec/support/shoulda_matchers.rb +6 -0
  133. data/spree_multi_vendor.gemspec +42 -0
  134. metadata +308 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f8d441270696f26a0ec197744282b7e53cb4a397a0286096865cdb40aaf53602
4
+ data.tar.gz: e5426a049d5bb36210ddaf1f805a8d665a702a495ff6d389234ff18079fc4e1a
5
+ SHA512:
6
+ metadata.gz: ad638c991ec5c6d4a30b90ab19cb29122ffc85304e7be0a3c45e0f8e3640893a7490377518177175648d42890033c068f1d5656026be1477141280de9734ec7d
7
+ data.tar.gz: 4896ff5234fe10c63eaa544729bee2039feac8b04f0021fc9f912cd9a3db68f015c0da592bfca1cdcd0d1395580dc687c32988c4228587b047250e7c25aac889
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'spree', github: 'spree/spree', branch: 'main'
4
+ gem 'spree_backend', github: 'spree/spree_backend', branch: 'main'
5
+ gem 'spree_frontend', github: 'spree/spree_legacy_frontend', branch: 'main'
6
+ gem 'spree_emails', github: 'spree/spree', branch: 'main'
7
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'main'
8
+ gem 'rails-controller-testing'
9
+
10
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2017 Spark Solutions Sp. z o.o.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name Spree nor the names of its contributors may be used to
13
+ endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,181 @@
1
+ # Spree Multi Vendor
2
+
3
+ This is a [spree multi vendor marketplace](https://spreecommerce.org/use-cases/multi-vendor-marketplace/) extension. It's a great starting point if you're building a marketplace on top of [Spree](https://spreecommerce.org). Our goal was flexibility to allow you to tweak it to your needs.
4
+
5
+ ## Developed by
6
+
7
+ [![Vendo](https://assets-global.website-files.com/6230c485f2c32ea1b0daa438/623372f40a8c54ca9aea34e8_vendo%202.svg)](https://getvendo.com?utm_source=spree_multi_vendor_github)
8
+
9
+ > All-in-one platform for all your Marketplace and B2B eCommerce needs. [Start your 30-day free trial](https://e98esoirr8c.typeform.com/contactvendo?typeform-source=spree_multi_vendor_github)
10
+
11
+ ## Open source vs Vendo
12
+
13
+ If you need a product that has all of the features out of the box, such us supplier onboarding, Stripe connect payment splitting and payouts, and don't require any custom development - we recommend using [Vendo](http://getvendo.com?utm_source=spree_multi_vendor_github) which is also based on Spree.
14
+
15
+ | feature | open source | [vendo] |
16
+ |---|---|---|
17
+ | basic vendorization | ✔️ | ✔️ |
18
+ | supplier onboarding | | ✔️ |
19
+ | supplier dashboard | | ✔️ |
20
+ | supplier management | | ✔️ |
21
+ | supplier product curation | | ✔️ |
22
+ | automatic payment splitting | | ✔️ |
23
+ | automatic payouts | | ✔️ |
24
+ | Afterpay / klarna / apple pay | | ✔️ |
25
+ | shopify / bigcommerce / woocommerce integration | | ✔️ |
26
+ | USPS, UPS, FedEx, DHL, and more | | ✔️ |
27
+ | bulk upload / import of products from CSV and XSLX | | ✔️ |
28
+ | bulk export of orders, shipments and more | | ✔️ |
29
+
30
+ ## Installation
31
+
32
+ 1. Add this extension to your Gemfile with this line:
33
+ ```ruby
34
+ gem 'spree_multi_vendor'
35
+ ```
36
+
37
+ 2. Install the gem using Bundler:
38
+ ```ruby
39
+ bundle install
40
+ ```
41
+
42
+ 3. Copy & run migrations
43
+ ```ruby
44
+ bundle exec rails g spree_multi_vendor:install
45
+ ```
46
+
47
+ 4. Restart your server
48
+
49
+ If your server was running, restart it so that it can find the assets properly.
50
+
51
+ 5. Optionally you can also create sample Vendor by running:
52
+
53
+ ```bash
54
+ bundle exec rake spree_multi_vendor:sample:create
55
+ ```
56
+
57
+ ## Upgrading
58
+
59
+ 1. Fetch new database migrations:
60
+
61
+ ```bash
62
+ bundle exec rake railties:install:migrations FROM=spree_multi_vendor
63
+ ```
64
+
65
+ 2. Run migrations
66
+
67
+ ```bash
68
+ bundle exec rails db:migrate
69
+ ```
70
+
71
+ ## Configuration
72
+
73
+ To change which models should be vendorized, in your Spree initializer (`config/initializers/spree.rb`) add:
74
+
75
+ ```ruby
76
+ SpreeMultiVendor::Config[:vendorized_models] = %w[product variant stock_location shipping_method other_model]
77
+ ```
78
+
79
+ This will lookup for `Spree::OtherModel` class. To add `vendor_id` column to that model run:
80
+
81
+ ```bash
82
+ bundle exec rails g migration AddVendorToSpreeOtherModels vendor:references
83
+ ```
84
+
85
+ ## API endpoints
86
+
87
+ Spree Multi Vendor adds new [API v2](https://api.spreecommerce.org/docs/api-v2/api/docs/v2/storefront/index.yaml) endpoints:
88
+
89
+ 1. `GET` Display Vendor information endpoint
90
+
91
+ ```
92
+ /api/v2/storefront/vendors/<vendor_slug>
93
+ ```
94
+
95
+ eg. `/api/v2/storefront/vendors/test-vendor`
96
+
97
+ you can also include Vendor image and/or Products in that call:
98
+
99
+ `/api/v2/storefront/vendors/test-vendor?include=image,products`
100
+
101
+ 2. `GET` Returns a list of Vendors
102
+
103
+ ```
104
+ /api/v2/storefront/vendors
105
+ ```
106
+
107
+ you can also include Vendor image and/or Products in that call:
108
+
109
+ `/api/v2/storefront/vendors?include=image,products`
110
+
111
+
112
+ And modfies existing:
113
+
114
+ 1. `GET` Filtering Products by Vendor ID(s):
115
+
116
+ ```
117
+ /api/v2/storefront/products?filter[vendor_ids]=1,2,3
118
+ ```
119
+
120
+ 2. `GET` Include Vendor information in Cart endpoint:
121
+
122
+ ```
123
+ /api/v2/storefront/cart?include=vendors,vendor_totals
124
+ ```
125
+
126
+ ## Email previews
127
+
128
+ Spree offers emails preview generator for development purposes.
129
+ To generate them, use command:
130
+
131
+ `bundle exec rails g spree_multi_vendor:mailers_preview`
132
+
133
+ After that, start rails server locally and go to:
134
+ `localhost:3000/rails/mailers`
135
+
136
+ (it requires seeded development database in order to work properly)
137
+
138
+ ## Testing
139
+
140
+ First bundle your dependencies, then run `rake`. `rake` will default to building the dummy app if it does not exist, then it will run specs. The dummy app can be regenerated by using `rake test_app`.
141
+
142
+ ```shell
143
+ bundle
144
+ bundle exec rake
145
+ ```
146
+
147
+ When testing your applications integration with this extension you may use it's factories.
148
+ Simply add this require statement to your spec_helper:
149
+
150
+ ```ruby
151
+ require 'spree_multi_vendor/factories'
152
+ ```
153
+
154
+ ## Contributing
155
+
156
+ If you'd like to contribute, please take a look at the
157
+ [instructions](CONTRIBUTING.md) for installing dependencies and crafting a good
158
+ pull request.
159
+
160
+ ## License
161
+
162
+ Spree Multi Vendor is copyright © 2017-2021
163
+ [Spark Solutions Sp. z o.o.][spark]. It is free software,
164
+ and may be redistributed under the terms specified in the
165
+ [LICENCE](LICENSE) file.
166
+
167
+ [LICENSE]: https://github.com/spark-solutions/spree_braintree_vzero/blob/master/LICENSE
168
+
169
+ ## About Vendo
170
+
171
+ <a href="https://getvendo.com?utm_source=spree_multi_vendor_github">
172
+ <img src="https://uploads-ssl.webflow.com/6230c485f2c32ea1b0daa438/62386b96518cdcbe111f134a_OG%20Image%20(2).png" style="max-height:400px" />
173
+ </a>
174
+
175
+ > [Vendo][vendo] is a great fit for marketplaces of all sizes - either with own fulfillment and multiple warehouses or in a dropshipping model. Vendo **automates everything** from **vendor onboarding**, accepting buyer **payments in over 135 currencies**, to supplier **payouts in 50 countries**.
176
+
177
+ > Vendo ensures excellent buyer experience with smooth product discovery and search, a multitude of payment methods and optimal shipping cost calculation. Vendo keeps suppliers happy with easy onboarding, automated products sync using their preferred method and easy payouts.
178
+
179
+ > [Start your 30-day free trial](https://e98esoirr8c.typeform.com/contactvendo?typeform-source=spree_multi_vendor_github)
180
+
181
+ [vendo]:http://getvendo.com?utm_source=spree_multi_vendor_github
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ require 'spree/testing_support/extension_rake'
6
+
7
+ RSpec::Core::RakeTask.new
8
+
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
16
+
17
+ desc 'Generates a dummy app for testing'
18
+ task :test_app do
19
+ ENV['LIB_NAME'] = 'spree_multi_vendor'
20
+ Rake::Task['extension:test_app'].invoke
21
+ end
@@ -0,0 +1,34 @@
1
+ module Spree
2
+ module Admin
3
+ class VendorSettingsController < Spree::Admin::BaseController
4
+ before_action :authorize
5
+ before_action :load_vendor
6
+
7
+ def update
8
+ if vendor_params[:image]
9
+ @vendor.create_image(attachment: vendor_params[:image])
10
+ end
11
+ if @vendor.update(vendor_params.except(:image))
12
+ redirect_to admin_vendor_settings_path
13
+ else
14
+ render :edit
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def authorize
21
+ authorize! :manage, :vendor_settings
22
+ end
23
+
24
+ def load_vendor
25
+ @vendor = current_spree_vendor
26
+ raise ActiveRecord::RecordNotFound unless @vendor
27
+ end
28
+
29
+ def vendor_params
30
+ params.require(:vendor).permit(Spree::PermittedAttributes.vendor_attributes)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,68 @@
1
+ module Spree
2
+ module Admin
3
+ class VendorsController < ResourceController
4
+
5
+ def create
6
+ if permitted_resource_params[:image]
7
+ @vendor.build_image(attachment: permitted_resource_params.delete(:image))
8
+ end
9
+ super
10
+ end
11
+
12
+ def update
13
+ if permitted_resource_params[:image]
14
+ @vendor.create_image(attachment: permitted_resource_params.delete(:image))
15
+ end
16
+ format_translations if defined? SpreeGlobalize
17
+ super
18
+ end
19
+
20
+ def update_positions
21
+ params[:positions].each do |id, position|
22
+ vendor = Spree::Vendor.find(id)
23
+ vendor.set_list_position(position)
24
+ end
25
+
26
+ respond_to do |format|
27
+ format.js { render plain: 'Ok' }
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def find_resource
34
+ Vendor.with_deleted.friendly.find(params[:id])
35
+ end
36
+
37
+ def collection
38
+ params[:q] = {} if params[:q].blank?
39
+ vendors = super.order(priority: :asc)
40
+ @search = vendors.ransack(params[:q])
41
+
42
+ @collection = @search.result.
43
+ includes(vendor_includes).
44
+ page(params[:page]).
45
+ per(params[:per_page])
46
+ end
47
+
48
+ def vendor_includes
49
+ {
50
+ image: [],
51
+ products: []
52
+ }
53
+ end
54
+
55
+ def format_translations
56
+ return if params[:vendor][:translations_attributes].blank?
57
+ params[:vendor][:translations_attributes].each do |_, data|
58
+ translation = @vendor.translations.find_or_create_by(locale: data[:locale])
59
+ translation.name = data[:name]
60
+ translation.about_us = data[:about_us]
61
+ translation.contact_us = data[:contact_us]
62
+ translation.slug = data[:slug]
63
+ translation.save!
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,62 @@
1
+ module Spree
2
+ module Api
3
+ module V1
4
+ class VendorsController < Spree::Api::BaseController
5
+ def index
6
+ @vendors = if params[:ids].present?
7
+ scope.where(id: params[:ids].split(','))
8
+ else
9
+ scope.load.ransack(
10
+ params[:q]
11
+ ).result
12
+ end
13
+ respond_with(@vendors)
14
+ end
15
+
16
+ def show
17
+ @vendor = scope.find(params[:id])
18
+ authorize! :show, @vendor
19
+ respond_with(@vendor)
20
+ end
21
+
22
+ def create
23
+ spree_authorize! :create, Spree::Vendor
24
+ @vendor = Spree::Vendor.new(vendor_params)
25
+ if @vendor.save
26
+ #render :show, status: 201
27
+ else
28
+ invalid_resource!(@vendor)
29
+ end
30
+ #render_order()
31
+ end
32
+
33
+ def update
34
+ @vendor = scope.find(params[:id])
35
+ authorize! :update, @vendor
36
+ if @vendor.update(vendor_params)
37
+ render :show
38
+ else
39
+ invalid_resource!(@vendor)
40
+ end
41
+ end
42
+
43
+ def destroy
44
+ @vendor = scope.find(params[:id])
45
+ authorize! :destroy, @vendor
46
+ @vendor.destroy
47
+ render plain: nil, status: 204
48
+ end
49
+
50
+ private
51
+
52
+ def scope
53
+ Spree::Vendor.accessible_by(current_ability)
54
+ end
55
+
56
+ def vendor_params
57
+ params.require(:vendor).permit(Spree::PermittedAttributes.vendor_attributes)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,32 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Platform
5
+ class VendorsController < ::Spree::Api::V2::Platform::ResourceController
6
+ private
7
+
8
+ def model_class
9
+ ::Spree::Vendor
10
+ end
11
+
12
+ def scope
13
+ ::Spree::Vendor.active
14
+ end
15
+
16
+ def resource_serializer
17
+ Spree::Api::V2::Platform::VendorSerializer
18
+ end
19
+
20
+ def collection_serializer
21
+ Spree::Api::V2::Platform::VendorSerializer
22
+ end
23
+
24
+ def spree_permitted_attributes
25
+ super + [:code]
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,33 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class VendorsController < ::Spree::Api::V2::ResourceController
6
+
7
+ private
8
+
9
+ def model_class
10
+ ::Spree::Vendor
11
+ end
12
+
13
+ def scope
14
+ ::Spree::Vendor.active
15
+ end
16
+
17
+ def resource
18
+ scope.find_by(slug: params[:id]) || scope.find(params[:id])
19
+ end
20
+
21
+ def resource_serializer
22
+ Spree::V2::Storefront::VendorSerializer
23
+ end
24
+
25
+ def collection_serializer
26
+ Spree::V2::Storefront::VendorSerializer
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,10 @@
1
+ module SpreeMultiVendor::Spree::Admin::BaseControllerDecorator
2
+ Spree::Admin::BaseController.include(Spree::Admin::VendorHelper)
3
+
4
+ def self.prepended(base)
5
+ base.helper_method :current_spree_vendor
6
+ base.helper_method :vendor_state_options
7
+ end
8
+ end
9
+
10
+ Spree::Admin::BaseController.prepend SpreeMultiVendor::Spree::Admin::BaseControllerDecorator
@@ -0,0 +1,79 @@
1
+ require 'typesense'
2
+
3
+ module SpreeMultiVendor::Spree::Admin::ProductsControllerDecorator
4
+ def self.prepended(base)
5
+ base.before_action only: [:create, :update] do
6
+ set_vendor_id(:product)
7
+ end
8
+ # base.after_action :load_product_vendor
9
+ base.before_action :initiate_ts_client
10
+ base.after_action :create_ts_product, only: [:create]
11
+ base.after_action :update_ts_product, only: [:update]
12
+ base.after_action :delete_ts_product, only: [:destroy]
13
+ end
14
+
15
+ def initiate_ts_client
16
+ @typesense = Typesense::Client.new(
17
+ nodes: [
18
+ {
19
+ host: 'iraxmydlt35g8v6qp-1.a1.typesense.net',
20
+ port: 443,
21
+ protocol: 'https'
22
+ }
23
+ ],
24
+ api_key: 'P524ViQst3aE0xlpbVY7or8bCAWbVtqv',
25
+ num_retries: 10,
26
+ healthcheck_interval_seconds: 1,
27
+ retry_interval_seconds: 0.01,
28
+ connection_timeout_seconds: 10
29
+ )
30
+ end
31
+
32
+ def create_ts_product
33
+ if @product
34
+ puts @product.vendor_id
35
+ @product_vendor = Spree::Vendor.find_by(id: @product.vendor_id)
36
+ classifications = Spree::Classification.where(product_id: @product.id)
37
+ categories = []
38
+ if !classifications.empty?
39
+ classifications.each do |classification|
40
+ taxon = Spree::Taxon.find_by(id: classification.taxon_id)
41
+ categories.push(taxon.name)
42
+ end
43
+ end
44
+ document = {
45
+ 'id' => @product.id.to_s,
46
+ 'name' => @product.name,
47
+ 'categories' => categories,
48
+ 'tag' => [],
49
+ 'store_id' => @product_vendor.code
50
+ }
51
+ document = @typesense.collections['dev-products'].documents.create(document)
52
+ end
53
+ end
54
+
55
+ def update_ts_product
56
+ if @product
57
+ classifications = Spree::Classification.where(product_id: @product.id)
58
+ categories = []
59
+ if !classifications.empty?
60
+ classifications.each do |classification|
61
+ taxon = Spree::Taxon.find_by(id: classification.taxon_id)
62
+ categories.push(taxon.name)
63
+ end
64
+ end
65
+ @typesense.collections['dev-products'].documents[@product.id.to_s].update(
66
+ 'name' => @product.name,
67
+ 'categories' => categories
68
+ )
69
+ end
70
+ end
71
+
72
+ def delete_ts_product
73
+ if @product
74
+ @typesense.collections['dev-products'].documents[@product.id.to_s].delete()
75
+ end
76
+ end
77
+ end
78
+
79
+ Spree::Admin::ProductsController.prepend SpreeMultiVendor::Spree::Admin::ProductsControllerDecorator
@@ -0,0 +1,8 @@
1
+ module SpreeMultiVendor::Spree::Admin::ResourceControllerDecorator
2
+ def set_vendor_id
3
+ return unless current_spree_vendor
4
+ params[resource.object_name.to_sym][:vendor_id] = current_spree_vendor.id
5
+ end
6
+ end
7
+
8
+ Spree::Admin::ResourceController.prepend SpreeMultiVendor::Spree::Admin::ResourceControllerDecorator
@@ -0,0 +1,7 @@
1
+ module SpreeMultiVendor::Spree::Admin::ShippingMethodsControllerDecorator
2
+ def self.prepended(base)
3
+ base.before_action :set_vendor_id, only: [:create, :update]
4
+ end
5
+ end
6
+
7
+ Spree::Admin::ShippingMethodsController.prepend SpreeMultiVendor::Spree::Admin::ShippingMethodsControllerDecorator
@@ -0,0 +1,7 @@
1
+ module SpreeMultiVendor::Spree::Admin::StockLocationsControllerDecorator
2
+ def self.prepended(base)
3
+ base.before_action :set_vendor_id, only: [:create, :update]
4
+ end
5
+ end
6
+
7
+ Spree::Admin::StockLocationsController.prepend SpreeMultiVendor::Spree::Admin::StockLocationsControllerDecorator
@@ -0,0 +1,13 @@
1
+ module SpreeMultiVendor::Spree::Admin::UsersControllerDecorator
2
+ private
3
+
4
+ def user_params
5
+ params.require(:user).permit(permitted_user_attributes |
6
+ [spree_role_ids: [],
7
+ vendor_ids: [],
8
+ ship_address_attributes: permitted_address_attributes,
9
+ bill_address_attributes: permitted_address_attributes])
10
+ end
11
+ end
12
+
13
+ Spree::Admin::UsersController.prepend SpreeMultiVendor::Spree::Admin::UsersControllerDecorator
@@ -0,0 +1,7 @@
1
+ module SpreeMultiVendor::Spree::Admin::VariantsControllerDecorator
2
+ def self.prepended(base)
3
+ base.before_action :set_vendor_id, only: [:create, :update]
4
+ end
5
+ end
6
+
7
+ Spree::Admin::VariantsController.prepend SpreeMultiVendor::Spree::Admin::VariantsControllerDecorator
@@ -0,0 +1,17 @@
1
+ module SpreeMultiVendor::Spree::Api::BaseControllerDecorator
2
+ Spree::Api::V2::BaseController.include(Spree::Api::VendorHelper)
3
+
4
+ def self.prepended(base)
5
+ base.helper_method :current_spree_vendor
6
+ end
7
+
8
+ private
9
+
10
+ def set_vendor_id(resource_name)
11
+ return unless current_spree_vendor
12
+
13
+ params[resource_name][:vendor_id] = current_spree_vendor.id
14
+ end
15
+ end
16
+
17
+ ::Spree::Api::V2::BaseController.prepend SpreeMultiVendor::Spree::Api::BaseControllerDecorator
@@ -0,0 +1,9 @@
1
+ module SpreeMultiVendor::Spree::Api::V1::ProductsControllerDecorator
2
+ def self.prepended(base)
3
+ base.before_action only: [:create, :update] do
4
+ set_vendor_id(:product)
5
+ end
6
+ end
7
+ end
8
+
9
+ Spree::Api::V2::Platform::ProductsController.prepend SpreeMultiVendor::Spree::Api::V1::ProductsControllerDecorator
@@ -0,0 +1,13 @@
1
+ module SpreeMultiVendor::Spree::Api::V1::UsersControllerDecorator
2
+ private
3
+
4
+ def user_params
5
+ params.require(:user).permit(permitted_user_attributes |
6
+ [spree_role_ids: [],
7
+ vendor_ids: [],
8
+ ship_address_attributes: permitted_address_attributes,
9
+ bill_address_attributes: permitted_address_attributes])
10
+ end
11
+ end
12
+
13
+ Spree::Api::V2::Platform::UsersController.prepend SpreeMultiVendor::Spree::Api::V1::UsersControllerDecorator