atkhayar-dev-spree-multi-vendor 0.0.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 (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