spree_api 3.6.6 → 3.7.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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