spree_api 3.6.6 → 3.7.0.rc1

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree/api/main.js +36 -0
  3. data/app/assets/javascripts/spree/api/storefront/cart.js +49 -0
  4. data/app/controllers/concerns/spree/api/v2/storefront/order_concern.rb +48 -0
  5. data/app/controllers/spree/api/errors_controller.rb +9 -0
  6. data/app/controllers/spree/api/v1/checkouts_controller.rb +12 -0
  7. data/app/controllers/spree/api/v1/customer_returns_controller.rb +1 -0
  8. data/app/controllers/spree/api/v1/line_items_controller.rb +11 -10
  9. data/app/controllers/spree/api/v1/orders_controller.rb +6 -6
  10. data/app/controllers/spree/api/v1/product_properties_controller.rb +1 -0
  11. data/app/controllers/spree/api/v1/products_controller.rb +6 -6
  12. data/app/controllers/spree/api/v1/promotions_controller.rb +1 -0
  13. data/app/controllers/spree/api/v1/reimbursements_controller.rb +1 -0
  14. data/app/controllers/spree/api/v1/shipments_controller.rb +12 -3
  15. data/app/controllers/spree/api/v1/variants_controller.rb +5 -3
  16. data/app/controllers/spree/api/v2/base_controller.rb +94 -0
  17. data/app/controllers/spree/api/v2/storefront/account/credit_cards_controller.rb +55 -0
  18. data/app/controllers/spree/api/v2/storefront/account_controller.rb +33 -0
  19. data/app/controllers/spree/api/v2/storefront/cart_controller.rb +124 -0
  20. data/app/controllers/spree/api/v2/storefront/checkout_controller.rb +108 -0
  21. data/app/controllers/spree/api/v2/storefront/countries_controller.rb +57 -0
  22. data/app/controllers/spree/api/v2/storefront/products_controller.rb +87 -0
  23. data/app/controllers/spree/api/v2/storefront/taxons_controller.rb +82 -0
  24. data/app/helpers/spree/api/api_helpers.rb +1 -1
  25. data/app/helpers/spree/api/v2/collection_options_helpers.rb +37 -0
  26. data/app/models/doorkeeper/access_grant_decorator.rb +3 -0
  27. data/app/models/doorkeeper/access_token_decorator.rb +3 -0
  28. data/app/models/doorkeeper/application_decorator.rb +3 -0
  29. data/app/serializers/spree/v2/storefront/account/credit_card_serializer.rb +16 -0
  30. data/app/serializers/spree/v2/storefront/account_serializer.rb +29 -0
  31. data/app/serializers/spree/v2/storefront/address_serializer.rb +14 -0
  32. data/app/serializers/spree/v2/storefront/base_serializer.rb +9 -0
  33. data/app/serializers/spree/v2/storefront/cart_serializer.rb +40 -0
  34. data/app/serializers/spree/v2/storefront/country_serializer.rb +18 -0
  35. data/app/serializers/spree/v2/storefront/image_serializer.rb +11 -0
  36. data/app/serializers/spree/v2/storefront/line_item_serializer.rb +17 -0
  37. data/app/serializers/spree/v2/storefront/option_type_serializer.rb +13 -0
  38. data/app/serializers/spree/v2/storefront/option_value_serializer.rb +11 -0
  39. data/app/serializers/spree/v2/storefront/payment_method_serializer.rb +11 -0
  40. data/app/serializers/spree/v2/storefront/payment_serializer.rb +12 -0
  41. data/app/serializers/spree/v2/storefront/product_property_serializer.rb +14 -0
  42. data/app/serializers/spree/v2/storefront/product_serializer.rb +35 -0
  43. data/app/serializers/spree/v2/storefront/promotion_serializer.rb +12 -0
  44. data/app/serializers/spree/v2/storefront/shipment_serializer.rb +16 -0
  45. data/app/serializers/spree/v2/storefront/shipping_rate_serializer.rb +14 -0
  46. data/app/serializers/spree/v2/storefront/state_serializer.rb +11 -0
  47. data/app/serializers/spree/v2/storefront/taxon_image_serializer.rb +11 -0
  48. data/app/serializers/spree/v2/storefront/taxon_serializer.rb +28 -0
  49. data/app/serializers/spree/v2/storefront/taxonomy_serializer.rb +11 -0
  50. data/app/serializers/spree/v2/storefront/user_serializer.rb +11 -0
  51. data/app/serializers/spree/v2/storefront/variant_serializer.rb +21 -0
  52. data/app/views/spree/api/v1/orders/order.v1.rabl +1 -1
  53. data/config/initializers/doorkeeper.rb +20 -0
  54. data/config/locales/en.yml +4 -0
  55. data/config/routes.rb +51 -3
  56. data/db/migrate/20180320110726_create_doorkeeper_tables.rb +69 -0
  57. data/docs/oauth/index.yml +77 -0
  58. data/docs/v2/storefront/index.yaml +2444 -0
  59. data/lib/spree/api/engine.rb +9 -2
  60. data/lib/spree_api.rb +2 -0
  61. data/spree_api.gemspec +5 -1
  62. metadata +92 -7
@@ -0,0 +1,82 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class TaxonsController < ::Spree::Api::V2::BaseController
6
+ include Spree::Api::V2::CollectionOptionsHelpers
7
+
8
+ def index
9
+ render_serialized_payload { serialize_collection(paginated_collection) }
10
+ end
11
+
12
+ def show
13
+ render_serialized_payload { serialize_resource(resource) }
14
+ end
15
+
16
+ private
17
+
18
+ def serialize_collection(collection)
19
+ dependencies[:collection_serializer].new(
20
+ collection,
21
+ collection_options(collection)
22
+ ).serializable_hash
23
+ end
24
+
25
+ def serialize_resource(resource)
26
+ dependencies[:resource_serializer].new(
27
+ resource,
28
+ include: resource_includes,
29
+ fields: sparse_fields
30
+ ).serializable_hash
31
+ end
32
+
33
+ def dependencies
34
+ {
35
+ collection_finder: Spree::Taxons::Find,
36
+ collection_paginator: Spree::Shared::Paginate,
37
+ collection_serializer: Spree::V2::Storefront::TaxonSerializer,
38
+ resource_serializer: Spree::V2::Storefront::TaxonSerializer
39
+ }
40
+ end
41
+
42
+ def collection_options(collection)
43
+ {
44
+ links: collection_links(collection),
45
+ meta: collection_meta(collection),
46
+ include: resource_includes,
47
+ fields: sparse_fields
48
+ }
49
+ end
50
+
51
+ def paginated_collection
52
+ dependencies[:collection_paginator].new(collection, params).call
53
+ end
54
+
55
+ def collection
56
+ dependencies[:collection_finder].new(scope: scope, params: params).execute
57
+ end
58
+
59
+ def resource
60
+ scope.find_by(permalink: params[:id]) || scope.find(params[:id])
61
+ end
62
+
63
+ def scope
64
+ Spree::Taxon.accessible_by(current_ability, :read).includes(scope_includes)
65
+ end
66
+
67
+ def scope_includes
68
+ node_includes = %i[icon products parent taxonomy]
69
+
70
+ {
71
+ parent: node_includes,
72
+ children: node_includes,
73
+ taxonomy: [root: node_includes],
74
+ products: [],
75
+ icon: []
76
+ }
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -177,7 +177,7 @@ module Spree
177
177
  ]
178
178
 
179
179
  def variant_attributes
180
- if @current_user_roles && @current_user_roles.include?('admin')
180
+ if @current_user_roles&.include?('admin')
181
181
  @@variant_attributes + [:cost_price]
182
182
  else
183
183
  @@variant_attributes
@@ -0,0 +1,37 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module CollectionOptionsHelpers
5
+ def collection_links(collection)
6
+ {
7
+ self: request.original_url,
8
+ next: pagination_url(collection.next_page || collection.total_pages),
9
+ prev: pagination_url(collection.prev_page || 1),
10
+ last: pagination_url(collection.total_pages),
11
+ first: pagination_url(1)
12
+ }
13
+ end
14
+
15
+ def collection_meta(collection)
16
+ {
17
+ count: collection.size,
18
+ total_count: collection.total_count,
19
+ total_pages: collection.total_pages
20
+ }
21
+ end
22
+
23
+ # leaving this method in public scope so it's still possible to modify
24
+ # those params to support non-standard non-JSON API parameters
25
+ def collection_permitted_params
26
+ params.permit(:format, :page, :per_page, :sort, :include, :fields, filter: {})
27
+ end
28
+
29
+ private
30
+
31
+ def pagination_url(page)
32
+ url_for(collection_permitted_params.merge(page: page))
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ Doorkeeper::AccessGrant.class_eval do
2
+ self.table_name = 'spree_oauth_access_grants'
3
+ end
@@ -0,0 +1,3 @@
1
+ Doorkeeper::AccessToken.class_eval do
2
+ self.table_name = 'spree_oauth_access_tokens'
3
+ end
@@ -0,0 +1,3 @@
1
+ Doorkeeper::Application.class_eval do
2
+ self.table_name = 'spree_oauth_applications'
3
+ end
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ module Account
5
+ class CreditCardSerializer < BaseSerializer
6
+ set_type :credit_card
7
+
8
+ attributes :cc_type, :last_digits, :month, :year, :name
9
+
10
+ belongs_to :payment_method,
11
+ serializer: Spree::V2::Storefront::PaymentMethodSerializer
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,29 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class AccountSerializer < BaseSerializer
5
+ set_type :user
6
+
7
+ attributes :email
8
+
9
+ attribute :store_credits, &:total_available_store_credit
10
+
11
+ attribute :completed_orders do |object|
12
+ object.orders.complete.count
13
+ end
14
+
15
+ has_one :default_billing_address,
16
+ id_method_name: :bill_address_id,
17
+ object_method_name: :bill_address,
18
+ record_type: :address,
19
+ serializer: :address
20
+
21
+ has_one :default_shipping_address,
22
+ id_method_name: :ship_address_id,
23
+ object_method_name: :ship_address,
24
+ record_type: :address,
25
+ serializer: :address
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class AddressSerializer < BaseSerializer
5
+ set_type :address
6
+
7
+ attributes :firstname, :lastname, :address1, :address2, :city, :zipcode, :phone, :state_name,
8
+ :company, :country_name, :country_iso3
9
+
10
+ attribute :state_code, &:state_abbr
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class BaseSerializer
5
+ include FastJsonapi::ObjectSerializer
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class CartSerializer < BaseSerializer
5
+ set_type :cart
6
+
7
+ attributes :number, :item_total, :total, :ship_total, :adjustment_total, :created_at,
8
+ :updated_at, :included_tax_total, :additional_tax_total, :display_additional_tax_total,
9
+ :display_included_tax_total, :tax_total, :currency, :state, :token, :email,
10
+ :display_item_total, :display_ship_total, :display_adjustment_total, :display_tax_total,
11
+ :promo_total, :display_promo_total, :item_count, :special_instructions, :display_total
12
+
13
+ has_many :line_items
14
+ has_many :variants
15
+ has_many :promotions, id_method_name: :promotion_id do |cart|
16
+ # we only want to display applied and valid promotions
17
+ # sometimes Order can have multiple promotions but the promo engine
18
+ # will only apply those that are more beneficial for the customer
19
+ # TODO: we should probably move this code out of the serializer
20
+ promotion_ids = cart.all_adjustments.eligible.nonzero.promotion.map { |a| a.source.promotion_id }.uniq
21
+
22
+ cart.order_promotions.where(promotion_id: promotion_ids).uniq(&:promotion_id)
23
+ end
24
+ has_many :payments do |cart|
25
+ cart.payments.valid
26
+ end
27
+ has_many :shipments
28
+
29
+ belongs_to :user
30
+ belongs_to :billing_address,
31
+ id_method_name: :bill_address_id,
32
+ serializer: :address
33
+
34
+ belongs_to :shipping_address,
35
+ id_method_name: :ship_address_id,
36
+ serializer: :address
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class CountrySerializer < BaseSerializer
5
+ set_type :country
6
+
7
+ attributes :iso, :iso3, :iso_name, :name, :states_required,
8
+ :zipcode_required
9
+
10
+ attribute :default do |object|
11
+ object.default?
12
+ end
13
+
14
+ has_many :states, if: proc { |_record, params| params && params[:include_states] }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class ImageSerializer < BaseSerializer
5
+ set_type :image
6
+
7
+ attributes :viewable_type, :viewable_id, :styles
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class LineItemSerializer < BaseSerializer
5
+ set_type :line_item
6
+
7
+ attributes :name, :quantity, :price, :slug, :options_text, :currency,
8
+ :display_price, :total, :display_total, :adjustment_total,
9
+ :display_adjustment_total, :additional_tax_total,
10
+ :display_additional_tax_total, :promo_total, :display_promo_total,
11
+ :included_tax_total, :display_included_tax_total
12
+
13
+ belongs_to :variant
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class OptionTypeSerializer < BaseSerializer
5
+ set_type :option_type
6
+
7
+ attributes :id, :name, :presentation, :position
8
+
9
+ has_many :option_values
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class OptionValueSerializer < BaseSerializer
5
+ set_type :option_value
6
+
7
+ attributes :id, :name, :presentation, :position
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class PaymentMethodSerializer < BaseSerializer
5
+ set_type :payment_method
6
+
7
+ attributes :type, :name, :description
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class PaymentSerializer < BaseSerializer
5
+ set_type :payment
6
+
7
+ attributes :amount, :response_code, :number, :cvv_response_code, :cvv_response_message,
8
+ :payment_method_id, :payment_method_name
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class ProductPropertySerializer < BaseSerializer
5
+ set_type :product_property
6
+
7
+ attribute :value
8
+
9
+ attribute :name, &:property_name
10
+ attribute :description, &:property_presentation
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class ProductSerializer < BaseSerializer
5
+ set_type :product
6
+
7
+ attributes :name, :description, :price, :currency, :display_price,
8
+ :available_on, :slug, :meta_description, :meta_keywords,
9
+ :updated_at
10
+
11
+ attribute :purchasable, &:purchasable?
12
+ attribute :in_stock, &:in_stock?
13
+ attribute :backorderable, &:backorderable?
14
+
15
+ has_many :variants
16
+ has_many :option_types
17
+ has_many :product_properties
18
+ has_many :taxons
19
+
20
+ # all images from all variants
21
+ has_many :images,
22
+ object_method_name: :variant_images,
23
+ id_method_name: :variant_image_ids,
24
+ record_type: :image,
25
+ serializer: :image
26
+
27
+ has_one :default_variant,
28
+ object_method_name: :default_variant,
29
+ id_method_name: :default_variant_id,
30
+ record_type: :variant,
31
+ serializer: :variant
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,12 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class PromotionSerializer < BaseSerializer
5
+ set_id :promotion_id
6
+ set_type :promotion
7
+
8
+ attributes :name, :description, :amount, :display_amount, :code
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class ShipmentSerializer < BaseSerializer
5
+ set_type :shipment
6
+
7
+ attributes :number, :final_price, :display_final_price,
8
+ :state, :shipped_at, :tracking_url
9
+
10
+ attribute :free, &:free?
11
+
12
+ has_many :shipping_rates, if: proc { |_record, params| params&.dig(:show_rates) }
13
+ end
14
+ end
15
+ end
16
+ end