spree_api_v2 0.2.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 (138) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +2 -0
  4. data/CHANGELOG.md +38 -0
  5. data/Gemfile +13 -0
  6. data/LICENSE +26 -0
  7. data/README.md +98 -0
  8. data/Rakefile +37 -0
  9. data/app/controllers/concerns/spree/api/v2/renderable.rb +51 -0
  10. data/app/controllers/spree/api/v2/base_controller.rb +31 -0
  11. data/app/controllers/spree/api/v2/children_controller.rb +29 -0
  12. data/app/controllers/spree/api/v2/countries_controller.rb +21 -0
  13. data/app/controllers/spree/api/v2/images_controller.rb +29 -0
  14. data/app/controllers/spree/api/v2/line_items_controller.rb +36 -0
  15. data/app/controllers/spree/api/v2/option_types_controller.rb +31 -0
  16. data/app/controllers/spree/api/v2/option_values_controller.rb +29 -0
  17. data/app/controllers/spree/api/v2/orders_controller.rb +11 -0
  18. data/app/controllers/spree/api/v2/prices_controller.rb +27 -0
  19. data/app/controllers/spree/api/v2/products_controller.rb +37 -0
  20. data/app/controllers/spree/api/v2/states_controller.rb +29 -0
  21. data/app/controllers/spree/api/v2/taxonomies_controller.rb +21 -0
  22. data/app/controllers/spree/api/v2/taxons_controller.rb +40 -0
  23. data/app/controllers/spree/api/v2/variants_controller.rb +35 -0
  24. data/app/models/spree/base_decorator.rb +5 -0
  25. data/app/models/spree/image_decorator.rb +3 -0
  26. data/app/models/spree/price_decorator.rb +3 -0
  27. data/app/models/spree/state_decorator.rb +3 -0
  28. data/app/serializers/spree/address_serializer.rb +9 -0
  29. data/app/serializers/spree/base_serializer.rb +13 -0
  30. data/app/serializers/spree/country_serializer.rb +7 -0
  31. data/app/serializers/spree/error_serializer.rb +52 -0
  32. data/app/serializers/spree/image_serializer.rb +13 -0
  33. data/app/serializers/spree/line_item_serializer.rb +13 -0
  34. data/app/serializers/spree/option_type_serializer.rb +8 -0
  35. data/app/serializers/spree/option_value_serializer.rb +8 -0
  36. data/app/serializers/spree/order_serializer.rb +21 -0
  37. data/app/serializers/spree/price_serializer.rb +7 -0
  38. data/app/serializers/spree/product_serializer.rb +12 -0
  39. data/app/serializers/spree/role_serializer.rb +5 -0
  40. data/app/serializers/spree/state_serializer.rb +7 -0
  41. data/app/serializers/spree/store_serializer.rb +6 -0
  42. data/app/serializers/spree/taxon_serializer.rb +16 -0
  43. data/app/serializers/spree/taxonomy_serializer.rb +7 -0
  44. data/app/serializers/spree/user_serializer.rb +5 -0
  45. data/app/serializers/spree/variant_serializer.rb +12 -0
  46. data/bin/rails +7 -0
  47. data/circle.yml +13 -0
  48. data/config/locales/en.yml +25 -0
  49. data/config/routes.rb +53 -0
  50. data/docs/.nojekyll +0 -0
  51. data/docs/Dockerfile +12 -0
  52. data/docs/Gemfile +13 -0
  53. data/docs/README.md +12 -0
  54. data/docs/Rakefile +9 -0
  55. data/docs/config.rb +39 -0
  56. data/docs/font-selection.json +148 -0
  57. data/docs/source/fonts/slate.eot +0 -0
  58. data/docs/source/fonts/slate.svg +14 -0
  59. data/docs/source/fonts/slate.ttf +0 -0
  60. data/docs/source/fonts/slate.woff +0 -0
  61. data/docs/source/fonts/slate.woff2 +0 -0
  62. data/docs/source/images/logo.png +0 -0
  63. data/docs/source/images/navbar.png +0 -0
  64. data/docs/source/includes/_authentication.md +61 -0
  65. data/docs/source/includes/_countries.md +133 -0
  66. data/docs/source/includes/_errors.md +17 -0
  67. data/docs/source/includes/_filtering.md +11 -0
  68. data/docs/source/includes/_images.md +201 -0
  69. data/docs/source/includes/_line_items.md +137 -0
  70. data/docs/source/includes/_option_types.md +267 -0
  71. data/docs/source/includes/_option_values.md +227 -0
  72. data/docs/source/includes/_orders.md +75 -0
  73. data/docs/source/includes/_pagination.md +10 -0
  74. data/docs/source/includes/_prices.md +188 -0
  75. data/docs/source/includes/_products.md +403 -0
  76. data/docs/source/includes/_states.md +96 -0
  77. data/docs/source/includes/_taxonomies.md +325 -0
  78. data/docs/source/includes/_taxons.md +414 -0
  79. data/docs/source/includes/_variants.md +430 -0
  80. data/docs/source/index.md +53 -0
  81. data/docs/source/javascripts/all.js +4 -0
  82. data/docs/source/javascripts/all_nosearch.js +3 -0
  83. data/docs/source/javascripts/app/_lang.js +162 -0
  84. data/docs/source/javascripts/app/_search.js +74 -0
  85. data/docs/source/javascripts/app/_toc.js +55 -0
  86. data/docs/source/javascripts/lib/_energize.js +169 -0
  87. data/docs/source/javascripts/lib/_imagesloaded.min.js +7 -0
  88. data/docs/source/javascripts/lib/_jquery.highlight.js +108 -0
  89. data/docs/source/javascripts/lib/_jquery.tocify.js +1042 -0
  90. data/docs/source/javascripts/lib/_jquery_ui.js +566 -0
  91. data/docs/source/javascripts/lib/_lunr.js +1910 -0
  92. data/docs/source/layouts/layout.erb +102 -0
  93. data/docs/source/stylesheets/_icon-font.scss +38 -0
  94. data/docs/source/stylesheets/_normalize.css +427 -0
  95. data/docs/source/stylesheets/_syntax.scss.erb +27 -0
  96. data/docs/source/stylesheets/_variables.scss +109 -0
  97. data/docs/source/stylesheets/print.css.scss +142 -0
  98. data/docs/source/stylesheets/screen.css.scss +622 -0
  99. data/lib/solidus_api_v2.rb +5 -0
  100. data/lib/spree_api_v2.rb +4 -0
  101. data/lib/spree_api_v2/engine.rb +21 -0
  102. data/solidus_api_v2.gemspec +36 -0
  103. data/spec/controllers/spree/api/v2/children_controller_spec.rb +28 -0
  104. data/spec/controllers/spree/api/v2/countries_controller_spec.rb +25 -0
  105. data/spec/controllers/spree/api/v2/images_controller_spec.rb +93 -0
  106. data/spec/controllers/spree/api/v2/line_items_controller_spec.rb +86 -0
  107. data/spec/controllers/spree/api/v2/option_types_controller_spec.rb +73 -0
  108. data/spec/controllers/spree/api/v2/option_values_controller_spec.rb +88 -0
  109. data/spec/controllers/spree/api/v2/orders_controller_spec.rb +15 -0
  110. data/spec/controllers/spree/api/v2/prices_controller_spec.rb +55 -0
  111. data/spec/controllers/spree/api/v2/products_controller_spec.rb +95 -0
  112. data/spec/controllers/spree/api/v2/states_controller_spec.rb +42 -0
  113. data/spec/controllers/spree/api/v2/taxonomies_controller_spec.rb +31 -0
  114. data/spec/controllers/spree/api/v2/taxons_controller_spec.rb +54 -0
  115. data/spec/controllers/spree/api/v2/variants_controller_spec.rb +108 -0
  116. data/spec/models/spree/base_decorator_spec.rb +9 -0
  117. data/spec/models/spree/price_decorator_spec.rb +3 -0
  118. data/spec/serializers/spree/address_serializer_spec.rb +35 -0
  119. data/spec/serializers/spree/country_serializer_spec.rb +27 -0
  120. data/spec/serializers/spree/error_serializer_spec.rb +116 -0
  121. data/spec/serializers/spree/image_serializer_spec.rb +30 -0
  122. data/spec/serializers/spree/line_item_serializer_spec.rb +40 -0
  123. data/spec/serializers/spree/option_type_serializer_spec.rb +27 -0
  124. data/spec/serializers/spree/option_value_serializer_spec.rb +29 -0
  125. data/spec/serializers/spree/order_serializer_spec.rb +69 -0
  126. data/spec/serializers/spree/price_serializer_spec.rb +28 -0
  127. data/spec/serializers/spree/product_serializer_spec.rb +47 -0
  128. data/spec/serializers/spree/role_serializer_spec.rb +17 -0
  129. data/spec/serializers/spree/state_serializer_spec.rb +25 -0
  130. data/spec/serializers/spree/store_serializer_spec.rb +25 -0
  131. data/spec/serializers/spree/taxon_serializer_spec.rb +44 -0
  132. data/spec/serializers/spree/taxonomy_serializer_spec.rb +27 -0
  133. data/spec/serializers/spree/user_serializer_spec.rb +17 -0
  134. data/spec/serializers/spree/variant_serializer_spec.rb +55 -0
  135. data/spec/spec_helper.rb +51 -0
  136. data/spec/support/shoulda_matchers.rb +6 -0
  137. data/spree_api_v2.gemspec +36 -0
  138. metadata +437 -0
@@ -0,0 +1,31 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class OptionTypesController < Spree::Api::V2::BaseController
5
+ skip_before_action :authenticate_user, only: [:index, :show]
6
+
7
+ def index
8
+ render_collection option_types.includes(:option_values, :products)
9
+ end
10
+
11
+ def show
12
+ if params[:option_value_id]
13
+ render_instance Spree::OptionValue.find(params[:option_value_id]).option_type
14
+ else
15
+ render_instance option_types.find(params[:id])
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def option_types
22
+ if params[:product_id]
23
+ Spree::Product.find(params[:product_id]).option_types
24
+ else
25
+ Spree::OptionType
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class OptionValuesController < Spree::Api::V2::BaseController
5
+ skip_before_action :authenticate_user, only: [:index, :show]
6
+
7
+ def index
8
+ render_collection option_values.includes(:option_type, :variants)
9
+ end
10
+
11
+ def show
12
+ render_instance option_values.find(params[:id])
13
+ end
14
+
15
+ private
16
+
17
+ def option_values
18
+ if params[:option_type_id]
19
+ Spree::OptionType.find(params[:option_type_id]).option_values
20
+ elsif params[:variant_id]
21
+ Spree::Variant.find(params[:variant_id]).option_values
22
+ else
23
+ Spree::OptionValue
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class OrdersController < Spree::Api::V2::BaseController
5
+ def show
6
+ render_instance @current_api_user.orders.find(params[:id])
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class PricesController < Spree::Api::V2::BaseController
5
+ skip_before_action :authenticate_user
6
+
7
+ def index
8
+ render_collection params[:variant_id] ? prices : prices.includes(:variant)
9
+ end
10
+
11
+ def show
12
+ render_instance prices.find(params[:id])
13
+ end
14
+
15
+ private
16
+
17
+ def prices
18
+ if params[:variant_id]
19
+ Spree::Variant.find(params[:variant_id]).prices
20
+ else
21
+ Spree::Price
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,37 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class ProductsController < Spree::Api::V2::BaseController
5
+ skip_before_action :authenticate_user, only: [:index, :show]
6
+
7
+ def index
8
+ render_collection products.includes :variants, :master, :taxons, :option_types, master: :images
9
+ end
10
+
11
+ def show
12
+ if params[:price_id]
13
+ render_instance Spree::Price.find(params[:price_id]).product
14
+ elsif params[:variant_id]
15
+ render_instance Spree::Variant.find(params[:variant_id]).product
16
+ elsif params[:image_id]
17
+ render_instance Spree::Image.variants.find(params[:image_id]).viewable.product
18
+ else
19
+ render_instance products.find(params[:id])
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def products
26
+ if params[:taxon_id].present?
27
+ Spree::Taxon.find(params[:taxon_id]).products
28
+ elsif params[:option_type_id]
29
+ Spree::OptionType.find(params[:option_type_id]).products
30
+ else
31
+ Spree::Product
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class StatesController < Spree::Api::V2::BaseController
5
+ skip_before_action :authenticate_user
6
+
7
+ def index
8
+ render_collection states
9
+ end
10
+
11
+ def show
12
+ render_instance states.find(params[:id])
13
+ end
14
+
15
+ private
16
+
17
+ def states
18
+ @states ||= begin
19
+ if params[:country_id].present?
20
+ Spree::Country.find(params[:country_id]).states.includes(:country)
21
+ else
22
+ Spree::State.includes(:country)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class TaxonomiesController < Spree::Api::V2::BaseController
5
+ skip_before_action :authenticate_user, only: [:index, :show]
6
+
7
+ def index
8
+ render_collection Spree::Taxonomy.includes(:taxons)
9
+ end
10
+
11
+ def show
12
+ if params[:taxon_id].present?
13
+ render_instance Spree::Taxon.find(params[:taxon_id]).taxonomy
14
+ else
15
+ render_instance Spree::Taxonomy.find(params[:id])
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class TaxonsController < Spree::Api::V2::BaseController
5
+ skip_before_action :authenticate_user, only: [:index, :show]
6
+
7
+ def index
8
+ render_collection taxons
9
+ end
10
+
11
+ def show
12
+ render_instance taxon
13
+ end
14
+
15
+ private
16
+
17
+ def taxon
18
+ if params[:taxon_id].present?
19
+ taxons.includes(parent: taxon_associations).find(params[:taxon_id]).parent
20
+ else
21
+ taxons.find(params[:id])
22
+ end
23
+ end
24
+
25
+ def taxons
26
+ if params[:taxonomy_id].present?
27
+ Spree::Taxonomy.find(params[:taxonomy_id]).taxons
28
+ .includes(*taxon_associations.-([:taxonomy]))
29
+ else
30
+ Spree::Taxon.includes(*taxon_associations)
31
+ end
32
+ end
33
+
34
+ def taxon_associations
35
+ [:products, :taxonomy, :parent]
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class VariantsController < Spree::Api::V2::BaseController
5
+ skip_before_action :authenticate_user
6
+
7
+ def index
8
+ render_collection variants.includes(:default_price, :prices, :option_values, :product, :images)
9
+ end
10
+
11
+ def show
12
+ if params[:price_id]
13
+ render_instance Spree::Price.find(params[:price_id]).variant
14
+ elsif params[:image_id]
15
+ render_instance Spree::Image.variants.find(params[:image_id]).viewable
16
+ else
17
+ render_instance variants.find(params[:id])
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def variants
24
+ if params[:product_id]
25
+ Spree::Product.find(params[:product_id]).variants_including_master
26
+ elsif params[:option_value_id]
27
+ Spree::OptionValue.find(params[:option_value_id]).variants
28
+ else
29
+ Spree::Variant
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ Spree::Base.class_eval do
2
+ def self.paginate(page_attrs)
3
+ page(page_attrs[:number]).per(page_attrs[:size])
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ Spree::Image.class_eval do
2
+ scope :variants, -> { where(viewable_type: 'Spree::Variant') }
3
+ end
@@ -0,0 +1,3 @@
1
+ Spree::Price.class_eval do
2
+ delegate :product, to: :variant
3
+ end
@@ -0,0 +1,3 @@
1
+ Spree::State.class_eval do
2
+ scope :find_country, -> (id) { includes(:country).find(id).country }
3
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ class AddressSerializer < Spree::BaseSerializer
3
+ attributes :first_name, :last_name, :address1, :address2, :city, :zipcode,
4
+ :phone
5
+
6
+ belongs_to :state
7
+ belongs_to :country
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ class BaseSerializer < ActiveModel::Serializer
3
+ def image_links(object)
4
+ {
5
+ original: object.url(:original),
6
+ mini: object.url(:mini),
7
+ small: object.url(:small),
8
+ product: object.url(:product),
9
+ large: object.url(:large)
10
+ }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ module Spree
2
+ class CountrySerializer < Spree::BaseSerializer
3
+ attributes :iso_name, :iso, :iso3, :name, :numcode, :states_required
4
+
5
+ has_many :states
6
+ end
7
+ end
@@ -0,0 +1,52 @@
1
+ module Spree
2
+ class ErrorSerializer
3
+ attr_accessor :resource, :options
4
+
5
+ def initialize(resource, options = {})
6
+ @resource = resource
7
+ @options = options
8
+ end
9
+
10
+ def as_json
11
+ { errors: error_messages }.to_json
12
+ end
13
+
14
+ private
15
+
16
+ def resource_error_objects(messages)
17
+ messages.map do |title, detail|
18
+ if title.is_a?(Hash) && title[:title]
19
+ error_object title[:title], title[:detail]
20
+ else
21
+ pointer = "data/attributes/#{title.to_s.split('.').join('/')}"
22
+ error_object title.to_s.gsub('.', ' '), detail.to_sentence, pointer: pointer
23
+ end
24
+ end
25
+ end
26
+
27
+ def error_messages
28
+ case resource
29
+ when Symbol
30
+ title_translation = Spree.t("api.errors.#{resource}.title")
31
+ detail_translation = Spree.t("api.errors.#{resource}.detail")
32
+ [error_object(title_translation, detail_translation)]
33
+ when Array
34
+ resource.map do |errors|
35
+ resource_error_objects errors
36
+ end.flatten
37
+ else
38
+ resource_error_objects resource.errors.messages
39
+ end
40
+ end
41
+
42
+ def error_object(title, detail, pointer: '')
43
+ error = {
44
+ detail: detail.gsub("\n", ' ').strip,
45
+ meta: options,
46
+ title: title.to_s.titleize
47
+ }
48
+
49
+ pointer.present? ? error.merge(pointer: pointer) : error
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ class ImageSerializer < Spree::BaseSerializer
3
+ attributes :position, :alt, :links
4
+
5
+ belongs_to :viewable
6
+
7
+ private
8
+
9
+ def links
10
+ image_links object.attachment
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ class LineItemSerializer < Spree::BaseSerializer
3
+ attributes :id, :quantity, :variant_id, :order_id, :currency, :cost_price,
4
+ :adjustment_total, :additional_tax_total, :price
5
+
6
+ %w(amount total).each do |money_method|
7
+ attributes money_method, "display_#{money_method}"
8
+ end
9
+
10
+ belongs_to :order
11
+ belongs_to :variant
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ module Spree
2
+ class OptionTypeSerializer < Spree::BaseSerializer
3
+ attributes :name, :presentation, :position
4
+
5
+ has_many :option_values
6
+ has_many :products
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Spree
2
+ class OptionValueSerializer < Spree::BaseSerializer
3
+ attributes :name, :presentation, :position
4
+
5
+ belongs_to :option_type
6
+ has_many :variants
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ module Spree
2
+ class OrderSerializer < Spree::BaseSerializer
3
+ attributes :email, :number, :state, :completed_at, :shipment_state,
4
+ :payment_state, :special_instructions, :currency, :channel,
5
+ :item_count, :approved_at, :confirmation_delivered,
6
+ :considered_risky, :canceled_at, :payment_total, :total,
7
+ :display_total
8
+
9
+ %w(
10
+ item adjustment shipment promo additional_tax included_tax
11
+ ).each do |money_method|
12
+ attributes "#{money_method}_total", "display_#{money_method}_total"
13
+ end
14
+
15
+ has_one :user
16
+ has_one :bill_address
17
+ has_one :ship_address
18
+
19
+ has_many :line_items
20
+ end
21
+ end